Привязка с флажком (выбрать все) - PullRequest
0 голосов
/ 28 марта 2012

Я хочу установить флажок, который работает как флажок select-all / unselect-all, но у меня возникают некоторые проблемы с привязкой.Я не новичок в XAML и WPF, поэтому для меня загадка, почему мой код не работает.Я надеюсь, что вы можете помочь.Вот что я делаю:

Прежде всего, я использую MVVMLight и теги события для команды.

Мое представление называется SetupView.xaml, а моя модель представления называется SetupViewModel.cs

public class SetupViewModel : ViewModelBase
{
    private List<FilterOptions> m_informationToShow;
    private FilterOptions m_currentSelection;

    public List<FilterOptions> InformationToShow
    {
        get { return m_informationToShow; }
        set
        {
            m_informationToShow = value;
            RaisePropertyChanged("InformationToShow");
            RaisePropertyChanged("InformationToShowCount");
        }
    }

    public FilterOptions CurrentSelection
    {
        get { return m_currentSelection; }
        set
        {
            m_currentSelection = value;
            RaisePropertyChanged("CurrentSelection");
        }
    }
}

Объект FilterOptions - это объект моей модели.Поскольку вам понадобится что-то из этого, чтобы понять проблему, здесь показана часть, которая вам необходима для понимания проблемы:

public class FilterOptions
{
    private string m_projectName;

    private BugsFilter m_bugsFilter;
    private BuildsFilter m_buildsFilter;
    private ChangeSetsFilter m_changeSetsFilter;
    private ProgressInfoFilter m_progressInfoFilter;
    private RisksFilter m_risksFilter;

    private bool m_projectHealthFilter;

    public bool AllFilterValues
    {
        get
        {
            if (m_bugsFilter.AtLeastOneFieldEnabled() ||
                m_buildsFilter.AtLeastOneFieldEnabled() ||
                m_changeSetsFilter.AtLeastOneFieldEnabled() ||
                m_progressInfoFilter.AtLeastOneFieldEnabled() ||
                m_risksFilter.AtLeastOneFieldEnabled() ||
                m_projectHealthFilter
                )
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        set
        {
            if (value == false)
            {
                m_bugsFilter.NoInformation();
                m_buildsFilter.NoInformation();
                m_changeSetsFilter.NoInformation();
                m_progressInfoFilter.NoInformation();
                m_risksFilter.NoInformation();
                m_projectHealthFilter = false;
            }
            else
            { 
                m_bugsFilter.CompleteInformation();
                m_buildsFilter.CompleteInformation();
                m_changeSetsFilter.CompleteInformation();
                m_progressInfoFilter.CompleteInformation();
                m_risksFilter.CompleteInformation();
                m_projectHealthFilter = true;
            }
        }
    }

Я продолжу свое представление:

<UserControl.Resources>
    <viewModels:SetupViewModel x:Key="thisViewModel"></viewModels:SetupViewModel>

    <DataTemplate x:Key="ProjectEntryTemplate">
        <Border Margin="75,20,5,0">
            <CheckBox Name="naam" Content="{Binding ProjectName}"
                      FontFamily="Segoe UI"
                      FontWeight="Light"
                      FontSize="24"
                      IsChecked="{Binding AllFilterValues}"
                      DataContext="{Binding}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Checked">
                        <mvvm:EventToCommand Command="{Binding ProjectListItemCheckedChanged, Source={StaticResource thisViewModel}}"
                                             PassEventArgsToCommand="True"/>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="Unchecked">
                        <mvvm:EventToCommand Command="{Binding ProjectListItemCheckedChanged, Source={StaticResource thisViewModel}}"
                                             PassEventArgsToCommand="True"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </CheckBox>
        </Border> 
    </DataTemplate>
</UserControl.Resources>

Как видите, у меня есть табличка с данными, которую я использую в списке:

<ListBox ItemsSource="{Binding InformationToShow}"
                            ItemTemplate="{StaticResource ProjectEntryTemplate}" 
                            SelectedIndex="0"
                            BorderThickness="0">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <mvvm:EventToCommand Command="{Binding SelectionListboxChanged}" 
                                                    PassEventArgsToCommand="True"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </ListBox>

Кроме того, в том же окне, в другой сетке справа, есть много флажков.Все они соответствуют данному фильтру из объекта FilterOptions.Вот что я делаю в своем представлении:

<StackPanel Orientation="Vertical"
                                Margin="0,5,0,5">
                        <CheckBox Name="activeBugs" Content="Active bugs"
                                  FontFamily="Segoe UI"
                                  FontWeight="Light"
                                  FontSize="22"
                                  IsChecked="{Binding CurrentSelection.BugsFilter.ActiveBugs}">
                        </CheckBox>

                        <CheckBox Name="resolvedBugs" Content="Resolved bugs"
                                  FontFamily="Segoe UI"
                                  FontWeight="Light"
                                  FontSize="22"
                                  IsChecked="{Binding CurrentSelection.BugsFilter.ResolvedBugs}"/>
                        <CheckBox Name="bugTrend" Content="Bug trend"
                                  FontFamily="Segoe UI"
                                  FontWeight="Light"
                                  FontSize="22"
                                  IsChecked="{Binding CurrentSelection.BugsFilter.BugTrend}"/>
                    </StackPanel>

И последнее, но не менее важное: это командные функции, которые есть в моей модели представления:

RelayCommand m_selectionChanged;
    public ICommand SelectionListboxChanged
    {
        get
        {
            if (m_selectionChanged == null)
                m_selectionChanged = new RelayCommand(param => SelectionListboxChangedExec(param), param => true);

            return m_selectionChanged;
        }
    }

    private void SelectionListboxChangedExec(object param)
    {
        SelectionChangedEventArgs e = (SelectionChangedEventArgs)param;
        ListBox b = (ListBox)e.Source;
        CurrentSelection = (FilterOptions)b.SelectedItem;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    RelayCommand m_projectCheckedChanged;
    public ICommand ProjectListItemCheckedChanged
    {
        get
        {
            if (m_projectCheckedChanged == null)
                m_projectCheckedChanged = new RelayCommand(param => ProjectListItemCheckedChangedExec(param), param => true);

            return m_projectCheckedChanged;
        }
    }

    private void ProjectListItemCheckedChangedExec(object param)
    {
        RoutedEventArgs e = (RoutedEventArgs)param;
        CheckBox checkBox = (CheckBox)e.Source;
        FilterOptions dataContext = (FilterOptions)checkBox.DataContext;

        if ((bool)checkBox.IsChecked)
            dataContext.AllFilterValues = true;
        else
        {
            dataContext.AllFilterValues = false;
        }

        //var expression = checkBox.GetBindingExpression(ToggleButton.IsCheckedProperty);
        //expression.UpdateSource();
    }

Я действительно не могунайти проблему.Есть кто-нибудь, кто может мне помочь?Ваша помощь будет высоко оценена !!

Спасибо всем заранее!

1 Ответ

0 голосов
/ 28 марта 2012

Почему вы должны сделать это с помощью команды?привязать флажок к классу BindingOption, который внутренне уведомляет родителя ViewModel, это уведомление действительно относится не к представлению, а к модели представления.

ViewModel не предполагаетсячтобы знать, что представление использует CheckBox.

Итак, что нужно сделать, чтобы отдельные параметры имели уведомляющее свойство IsSelected, связанное с CheckBox es, предоставьте каждому из них ссылку на родителя ViewModel, и уведомить родителя, когда текущий IsSelected был изменен.Делая это в представлении, хотя вы можете найти много способов сделать это, вы не должны этого делать, MVVM - это отделение задач просмотра от задач представления.

Этот способ также дает вам контроль над "Выбрать все "," Отменить выбор всех "или" Отменить выбор "и т. Д.

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