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

Combobox-Datatemplate & Selection TextBox - c #, wpf

Tengo un combobox que tiene 2 artículos. Cada elemento es un objeto derivado de una interfaz común. Hay una propiedad DisplayText en cada objeto. Cada objeto está templado para tener un visual diferente. Todo funciona bien, excepto cuando se selecciona uno de esos objetos, la imagen visual se muestra en el cuadro de texto del cuadro combinado. Quiero que muestre la propiedad SelectedText del objeto seleccionado en el cuadro de texto y el DisplayText dentro de la plantilla del elemento. ¿Cómo especifico mi enlace para eso por favor?

Aquí está mi código:

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>

Tenga en cuenta que este es un ejemplo simplificado y he implementado INPC para todos mis objetos.

Respuestas

0 para la respuesta № 1

Prueba esto:

<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 para la respuesta № 2

Agregó un Data Trigger dentro de la DataTemplate para cumplir con su requisito. Prueba esto.

  <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>