Wpf MVVM ComboBox с флажками и выбрать все флажки - PullRequest
0 голосов
/ 09 мая 2018

У меня есть ComboBox с CheckBoxes, и я хотел бы реализовать опцию Выбрать все. Я делаю это следующим образом в XAML:

<ComboBox Text="Select Industry"  TextSearch.TextPath ="Industry"  Name="industry"  IsEditable="True" IsReadOnly="True" >
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem>
                <CheckBox x:Name="allIndustry">All</CheckBox>
            </ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource industrySource}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Name="industry" IsChecked="{Binding ElementName=allIndustry, Path=IsChecked, Mode=OneWay}" Content="{Binding Industry}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Я получаю эту функциональность в представлении, используя приведенный выше код:

All Selected Items ComboBox example

Но проблема здесь в том, что я использовал для привязки своего свойства IsChecked ComboBox свойства ViewModel IsChecked, и при реализации этого решения я потерял эту функцию.

Я хотел бы переместить линию

IsChecked="{Binding ElementName=allIndustry, Path=IsChecked, Mode=OneWay}"

В

<ComboBoxItem>
<CheckBox x:Name="allIndustry">All</CheckBox>
</ComboBoxItem>

Измените привязку на OneWayToSource и обновите с x:Name="allIndustry" мои выбранные элементы в CheckBox.

Я должен быть в состоянии сделать это только из представления XAML ...

После этого я бы просто привязал свой ComboBox к свойству ViewModel ...

Это будет выглядеть так:

<ComboBox Text="Select Industry"  TextSearch.TextPath ="Industry"  Name="industry"  IsEditable="True" IsReadOnly="True" >
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem>
                <CheckBox x:Name="allIndustry" IsChecked="{Binding ElementName=industry, Path=IsChecked, Mode=OneWayToSource}">All</CheckBox>
            </ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource industrySource}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Name="industry" IsChecked="{Binding IsChecked}" Content="{Binding Industry}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Но когда я применяю это изменение, нажатие кнопки «Выбрать все» не обновляет элементы ComboBox:

ComboBox Select All fails

Это свойство ViewModel

 private ObservableCollection<IndustryFilter> _industryFilters;
        public ObservableCollection<IndustryFilter> IndustryFilters
        {
            get { return _industryFilters; }
            set
            {
                _industryFilters = value;
                PropertyChanged(this, new PropertyChangedEventArgs("IndustryFilters"));
            }
        }

И это Источник, определенный в верхней части представления XAML

<UserControl x:Class="Digital_Data_House_Bulk_Mailer.View.MailView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Digital_Data_House_Bulk_Mailer.View"
             xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
             xmlns:model="clr-namespace:Digital_Data_House_Bulk_Mailer.ViewModel"
             mc:Ignorable="d" 
             HorizontalAlignment="Stretch"
             VerticalAlignment="Stretch"
             HorizontalContentAlignment="Stretch"
             VerticalContentAlignment="Stretch"
             >
    <UserControl.Resources>

        <CollectionViewSource x:Key="industrySource" Source="{Binding IndustryFilters}"/>

    </UserControl.Resources>

Как мне обновить все ComboBox с именем «industry» из источника ComboBox.Item и сохранить флажок «industry» привязанным к ViewModel? Привет

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

С помощью bruno.almeida мне удалось решить эту проблему

Это определение свойства ViewModel для фильтра состояния - то же, что и поле Industry, которое я спросил:

private ObservableCollection<StateFilter> _stateFilters;
        public ObservableCollection<StateFilter> StateFilters
        {
            get { return _stateFilters; }
            set
            {
                _stateFilters = value;
                PropertyChanged(this, new PropertyChangedEventArgs("StateFilters"));
            }
        }

        private bool _stateFilter;
        public bool StateFilter
        {
            get { return _stateFilter; }
            set
            {
                _stateFilter = value;

                ObservableCollection<StateFilter> local = new ObservableCollection<StateFilter>();

                foreach (var filter in StateFilters)
                {
                    filter.IsChecked = _stateFilter;
                    local.Add(filter);

                }
                StateFilters = local;

                PropertyChanged(this, new PropertyChangedEventArgs("StateFilter"));

            }
        }

Это пример кода XAML:

Ресурсы:

ComboBox:

<ComboBox Text="Select State"  TextSearch.TextPath ="State"  Name="state"  IsEditable="True" IsReadOnly="True" >

    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem >
                <CheckBox  Name="all" IsChecked="{Binding StateFilter}">All</CheckBox>
            </ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource stateSource}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Name="chkTask" IsChecked="{Binding IsChecked}"  Content="{Binding State}" ></CheckBox>
        </DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
0 голосов
/ 09 мая 2018

Без полного рабочего примера нелегко привести полный рабочий пример.

Вы можете решить свою проблему, используя другой подход.

Ваш IndustryFilters должен быть не ObservableCollection<IndustryFilter>, а экземпляром объекта, подобного этому:

public class IndustryFilters : INotifyPropertyChanged {
    private _isAllChecked;

    public IsAllChecked {
        get {return _isAllChecked;}
        set{
            _isAllChecked = value;

            foreach(var filter in Filters) { 
                filter.IsChecked = value;
            }

            PropertyChanged(...);
        }
    }

    public ObservableCollection<IndustryFilter> Filters
    {
        get { return _industryFilters; }
        set
        {
            _industryFilters = value;
            PropertyChanged(this, new propertyChangedEventArgs("IndustryFilters"));
        }
    }
}

Затем вы связываете IsChecked из <CheckBox x:Name="allIndustry">All</CheckBox> со свойством IsAllChecked.

Тогда вам нужно будет найти способ изменить источник вашего ComboBox на IndustryFilters.Filters.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...