/ / Combobox-Datatemplate & Selection TextBox - c #, wpf

Combobox-Datatemplate & Selection TextBox - c #, wpf

J'ai une combobox qui contient 2 éléments. Chaque élément est un objet dérivant d'une interface commune. Il existe une propriété DisplayText sur chaque objet. Chaque objet est modélisé de manière à avoir un visuel différent. Tout fonctionne bien, sauf que lors de la sélection de l'un de ces objets, le visuel s'affiche dans la zone de texte de la zone de liste déroulante. Je veux qu'il affiche la propriété SelectedText de l'objet sélectionné dans la zone de texte et le DisplayText à l'intérieur du modèle d'élément. Comment puis-je spécifier ma reliure pour cela s'il vous plaît?

Voici mon code:

public interface IMyDate
{
string DisplayText { get; }
string SelectedText { get; }
}

public class TodayMinus1 : IMyDate
{
public string DisplayText { get { return "Yesterday"; } }
public string SelectedText{get { return DateTime.Today.AddDays(-1).ToString(); }}
}

public class Today : IMyDate
{
public string DisplayText { get { return "TODAY"; } }
public string SelectedText { get { return DateTime.Today.ToString(); } }
}

public class MyMainViewModel
{
public MyMainViewModel()
{
MyDates = new List<IMyDate>() {new Today(), new TodayMinus1()};
}

public List<IMyDate> MyDates { get; set; }
public IMyDate SelectedDate { get; set; }
}

<ComboBox MaxHeight="26" VerticalAlignment="Center"  x:Name="contextDropdown" ItemsSource="{Binding MyDates}"                                                  SelectedItem="{Binding SelectedDate}"  Grid.Column="1" Width="150" Margin="5">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type local:TodayMinus1}">
<TextBlock Text="{Binding DisplayText}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Today}">
<TextBlock Text="{Binding DisplayText}"/>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>

Veuillez noter qu'il s'agit d'un exemple simplifié à l'extrême et j'ai implémenté INPC pour tous mes objets.

Réponses:

0 pour la réponse № 1

Essaye ça:

<ComboBox MaxHeight="26" VerticalAlignment="Center"  x:Name="contextDropdown" ItemsSource="{Binding MyDates}"
SelectedItem="{Binding SelectedDate}"  Grid.Column="1" Width="150" Margin="5">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type local:TodayMinus1}">
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding DisplayText}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="{x:Null}">
<Setter Property="Text" Value="{Binding SelectedText}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Today}">
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding DisplayText}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="{x:Null}">
<Setter Property="Text" Value="{Binding SelectedText}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>

0 pour la réponse № 2

Ajout d'un DataTrigger dans le DataTemplate pour répondre à vos besoins. Essaye ça.

  <ComboBox  MaxHeight="26" VerticalAlignment="Center"  x:Name="contextDropdown" ItemsSource="{Binding MyDates}"                                                  SelectedItem="{Binding SelectedDate}"  Grid.Column="1" Width="150" Margin="5">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type local:TodayMinus1}">
<TextBlock Text="{Binding DisplayText}" x:Name="DisplayBox"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}" Value="{x:Null}">
<Setter TargetName="DisplayBox" Property="Text" Value="{Binding SelectedText}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Today}">
<TextBlock Text="{Binding DisplayText}" x:Name="DisplayBox"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}" Value="{x:Null}">
<Setter TargetName="DisplayBox" Property="Text" Value="{Binding SelectedText}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.Resources>
</ComboBox>