WPF-ItemsControl中的条件绑定

时间:2019-03-14 22:59:06

标签: c# wpf

我对WPF还是很陌生,并且刚刚开始进行数据绑定。我想要做的是基于视图模型中的列表生成复选框列表。我目前使用的XAML是:

<ItemsControl ItemsSource="{Binding Path=TestList, UpdateSourceTrigger=PropertyChanged}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Path=Name}" IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,5,10,5" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这可以正常工作,并为TestList中的每个项目生成一个复选框。我只想为条件TestList[i].Type == "Mode"为真的项目生成复选框。我认为我可能需要使用<DataTrigger>元素,但是我不知道如何执行此操作的详细信息。

[EDIT]为了明确起见,TestList的每个元素都具有NameEnabledType属性。

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。但是,最简单的 static 方法是在您的 ViewModel

中对其进行过滤
Filtered = new ObservableCollection(TestList.Where(x => x.Type == "Mode"));

...

<ItemsControl ItemsSource="{Binding Path=Filtered , UpdateSourceTrigger=PropertyChanged}">

注意 :有一些更动态的方法可以实现此目的,尽管这可能会帮助您 < / p>

答案 1 :(得分:0)

由于我想如果TestList.Type发生更改,您想使该复选框出现,所以我建议创建一个Converter并将其绑定到CheckBox Visibility。

public sealed class CheckBoxVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null)
            return Visibility.Visible;

        var type = (string)value;
        var condition  = (string)parameter;
        return type.Equals(condition) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

然后在字典中添加对您的名称空间

的引用
xmlns:converters="clr-namespace:Projct.Converters;

以及在资源词典中

 <converters:CheckBoxVisibilityConverter x:Key="CheckBoxConverter"/>

最后在xaml中

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <CheckBox
            Margin="10,5,10,5"
            Content="{Binding Path=Name}"
            IsChecked="{Binding Path=Enabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
            Visibility="{Binding Path=Type, Converter={StaticResource CheckBoxConverter}, ConverterParameter=Mode}" />    
    </DataTemplate>
</ItemsControl.ItemTemplate>