WPF - условное связывание в ItemsControl - PullRequest
1 голос
/ 15 марта 2019

Я очень новичок в 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>, но я не знаю деталей, как это сделать.

[ПРАВИТЬ] Просто чтобы уточнить, каждый элемент TestList имеет Name, Enabled и Type свойства.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Есть несколько способов сделать это.Однако самый простой подход static будет просто отфильтровать его в вашей ViewModel

Filtered = new ObservableCollection(TestList.Where(x => x.Type == "Mode"));

...

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

Примечание :Есть более изощренные и динамичные способы для достижения этой цели, хотя это может помочь вам

0 голосов
/ 15 марта 2019

Поскольку я предполагаю, что вы хотите, чтобы флажок появлялся при изменении TestList.Type, я бы предложил создать конвертер и связать его с видимостью CheckBox.

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...