2012-03-28 17 views
0

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> 

あなたが見ることができるように、私はリストボックスに使用していますDataTemplateを持っている:それから、ほか

<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オブジェクトの特定のフィルタに対応します。

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(); 
    } 

私は本当にカントは、問題を見つける:

<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> 

なく、少なくとも最後に、これは私が私の見解モデルを持っているコマンドの機能は以下のとおりです。これは私が私の見解でやっているものです。私を助けることができる人はいますか? お手数をおかけしますようお願い申し上げます。

ありがとうございました!

答えて

0

なぜコマンドで実行する必要がありますか?チェックボックスを内部でViewModelという親に通知するBindingOptionクラスにバインドすると、この通知は実際にはビューにはなくビューモデルに属します。

ViewModelは、ビューがCheckBoxを使用していることを認識していません。

だからuは、個々のオプションはCheckBox ESにバインドされた通知IsSelected性質を持っている持って何をすべきか、親ViewModelを参照して、それらのそれぞれを提供し、現在のIsSelectedが変更されたときに親に通知します。ビューでこれを行うには、それを行うための多くの方法を見つけることができますが、MVVMはview-tasksとviewmodel-tasksを分離することです。

これが道でも、あなたが

+0

私はコマンドを使用していない場合でも、それはまだ動作していない「すべての選択を解除」かなどを「反転選択」、「すべて選択」に制御することができます。 –

+0

がよくあるため、バグが存在しなければならない私だと思う...私はすべてを正しくバインドしなかったが、問題がまだ残っています: ます。private void SelectionListboxChangedExec(オブジェクトのparam) { SelectionChangedEventArgs E =(SelectionChangedEventArgs)PARAM。 ListBox b =(リストボックス)e。ソース; CurrentSelection =(FilterOptions)b.SelectedItem; CurrentSelection.ProjectName = "ba"; RaisePropertyChanged( "CurrentSelection"); } ちょうど動作しますが、バインドしているときに更新されていません.... –

+0

@JoshMulholland、何が更新されていないのか正確に理解できませんでした。コードで質問を拡張し、また、ここでコメントしてください。私はあなたの更新について通知を受けます。ありがとう。 – Shimmy