Combobox-Datatemplate&选择TextBox

时间:2013-12-30 21:09:56

标签: c# wpf

我有一个有两个项目的组合框。每个项目都是来自通用界面的对象。每个对象都有一个DisplayText属性。每个对象都是模板化的,以便具有不同的视觉效果。一切正常,除非选择其中一个对象,视觉效果将显示在组合框文本框中。我希望它在文本框中显示所选对象的SelectedText属性,在项目模板中显示DisplayText。如何指定我的绑定?

这是我的代码:

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>

请注意,这是一个过于简单的示例,我已经为所有对象实现了INPC。

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

在DataTemplate中添加了DataTrigger以满足您的要求。试试这个。

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