繁体   English   中英

WPF ComboBox条件ItemTemplate

[英]WPF ComboBox Conditional ItemTemplate

我有一个绑定到可能值列表的ComboBox是ViewModel。

<ComboBox ItemsSource="{Binding PossibleOperands}" SelectedValue="{Binding Operand, Mode=TwoWay}" VerticalAlignment="Center"  Foreground="Black"  FontSize="13" FontFamily="Calibri"  Height="23" Grid.Column="1" Margin="7,2,0,2"/>

对于大多数值,我希望显示一个简单的字符串(在上面的示例中,“操作符名称”),但是对于其中一个值,我想显示一个字符串+ 2个comboBoxes。

小样: 在此处输入图片说明

使用MSDN中所述的ItemTemplateSelector

您可以定义一个带有文本块和2个组合框的ItemTemplate。 将ComboBoxes的可见性与所需属性绑定。 这样,仅对于某些项目,组合框才可见。

我之前做过类似的事情:假设您有一个这样的类:(用于ComboBox的Content)

    public class Content
    {
      private String _Texty;
      public String Texty
      {
        get{return _Texty;}
        set { _Texty = value; }
      }
      public List<String> Comb1{get ; set;}
      public List<String> Comb2 { get; set; }
      public Content(string t, List<String> comb1, List<String> comb2)
      {
        Texty = "Some Text";
        Comb1 = comb1;
        Comb2 = comb2;
      } 
    }

您将需要一个Converter ,在xaml部分中定义如下:

    <utils:ContentToVisibleConverter x:Key="MyConverter" /> 

utils是这样的:

    xmlns:utils="clr-namespace:YOUR CONVERTER CLASS NAMESPACE"

因此,定义您的Combobox像这样的XAML:

    <ComboBox x:Name="Combo" Margin="4" 
    Height="23" 
    Width="250"  ItemsSource="{Binding Collection}" >
        <ComboBox.ItemTemplate> 
            <DataTemplate> 
                <StackPanel Orientation="Horizontal" >   
                    <TextBlock Text="{Binding Texty}" Margin="4,0"/>

                    <Grid Margin="20 0 0 0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="Entity Type:" 
                                   Visibility="{Binding Path=Comb1, Converter={StaticResource MyConverter}}" />
                        <ComboBox  Grid.Column="1" ItemsSource="{Binding Comb1}" Width="80" Margin="4,0"
                                   Visibility="{Binding Path=Comb1, Converter={StaticResource MyConverter}}"/>
                        <TextBlock Grid.Column="2" Text="Entity:" 
                                   Visibility="{Binding Path=Comb2, Converter={StaticResource MyConverter}}"/>
                        <ComboBox  Grid.Column="3" ItemsSource="{Binding Comb2}" Width="80" Margin="4,0"
                                   Visibility="{Binding Path=Comb2, Converter={StaticResource MyConverter}}"/>
                    </Grid>

                </StackPanel> 
            </DataTemplate> 
        </ComboBox.ItemTemplate>
    </ComboBox>

在代码的某个位置,我以这种方式使用Binding集合:

    private ObservableCollection<Content> _Collection;
     public ObservableCollection<Content> Collection
     {
        get { return _Collection; }
        set { _Collection = value; NotifyPropertyChanged("Collection"); }
    }
    // Fill it like this:
      Collection = new ObservableCollection<Content>(); 
      Collection.Add(new Content("Some Stuff", null, null));
      Collection.Add(new Content("Some Stuff", null, null));
      Collection.Add(new Content("Some Stuff", null, null));
      Collection.Add(new Content("Some Stuff",
                       new List<String>() { "One", "Two" },
                       new List<String>() { "One", "Two" }));

最后,我为仅包含以下内容的转换器定义一个类:

    public class ContentToVisibleConverter : System.Windows.Markup.MarkupExtension, IValueConverter
   {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var s = value as List<string>;
        if (s != null)
            return s.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
        else return Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter,  System.Globalization.CultureInfo culture)
    {
        return null;
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
  }

就这样,让我知道它是否对您有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM