2017-07-25 106 views
1

我在窗口4名列表視圖,每個ListView中都有一個複選框列像這樣: enter image description here選擇ListView中的所有項目,通過命令(MVVM)

現在我想實現1個命令,我可以綁定到我有每個ListView的標題中的CheckBox。因此,如果單擊標題中的複選框,它將選擇該ListView中的所有項目,如果再次單擊,它將再次取消選中它們。

我知道通過代碼背後的點擊事件很容易做到這一點,但我不認爲這符合MVVM,是嗎?

但我也不想在我的視圖模型4個不同的「IsSelected」屬性,我可以再結合就像是有人在列表視圖的風格在這個職位建議:Select All items in ListView with MVVM

是否有任何其他方式?是否有可能發送ListView控件作爲命令參數?

我試過:

<ListView x:Name="UserDemandListView" Grid.Column="2" Grid.Row="2" MinWidth="200" ItemsSource="{Binding DemandLicenses}" Grid.RowSpan="2"> 
     <ListView.View> 
       <GridView> 
        <!--<SnippetGridViewColumnCheckBox>--> 
        <GridViewColumn CellTemplate="{StaticResource FirstCell}" Width="25"> 
         <CheckBox x:Name="CheckAll3" Content="" Command="{Binding SelectAllCommand}" CommandParameter="{Binding ElementName=UserDemandListView}" Margin="4,0,0,0"/> 
        </GridViewColumn> 
        <!--</SnippetGridViewColumnCheckBox>--> 

但參數在我的命令總是空。我WPF技能有點生疏我猜...

+0

要什麼屬性DemandLicence是複選框約束? –

+1

如果你將你的參數綁定到「DemandLicenses」,那麼你可以迭代你的viewmodel並選擇它們? – GCamel

+0

@RomanoZumbé它尚未綁定到任何屬性,因爲我不需要綁定它。 – Whatever

回答

2

你應該只設置對象的財產DemandLicenses綁定到行級CheckBox

XAML

<ListView x:Name="UserDemandListView" Grid.Column="2" Grid.Row="2" MinWidth="200" ItemsSource="{Binding DemandLicenses}" Grid.RowSpan="2"> 
    <ListView.View> 
     <GridView> 
      <!--<SnippetGridViewColumnCheckBox>--> 
      <GridViewColumn CellTemplate="{StaticResource FirstCell}" Width="25"> 
       <CheckBox x:Name="CheckAll3" Content="" Margin="4,0,0,0" Checked={Binding CheckAllDemandLicenses}"/> 
      </GridViewColumn> 
      <!--</SnippetGridViewColumnCheckBox>--> 

查看模型

// Property, that shows if all Items need to be checked 
private bool _checkAllDemandLicenses; 
public bool CheckAllDemandLicenses 
{ 
    get 
    { 
     return _checkAllDemandLicenses; 
    } 
    set 
    { 
     _checkAllDemandLicenses = value; 

     foreach(DemandLicense d in DemandLicenses) 
     { 
      // Set the property, that is bound to the row level checkbox 
      d.Selected = value; 
     } 

     OnPropertyChanged("CheckAllDemandLicenses"); // Or whatever your implementation for INotifyPropertyChanged is 
     OnPropertyChanged("DemandLicenses"); 
    } 
} 

這樣,您不必將命令綁定到CheckBox,也不需要訪問ViewModel中的視圖元素。

+0

好的,但那正是我不想做的。因爲我有** 4個不同的ListView **,然後我需要** 4種不同的屬性**。 我的意思是如果沒有其他解決方案,我將不得不這樣做。但我希望有更好的辦法。還是我理解你錯了? – Whatever

0

又快又髒?

private void chkAll_Checked(object sender, RoutedEventArgs e) 
    { 
     if ((sender as CheckBox).Name == "chkMailAll") 
      foreach (SupEquipementViewModel c in _dataGrid.ItemsSource) 
       c.EnvoiMail = 1; 

     if ((sender as CheckBox).Name == "chkActiveAll") 
      foreach (SupEquipementViewModel c in _dataGrid.ItemsSource) 
       c.Actif = 1; 

     if ((sender as CheckBox).Name == "chkRemoveAll") 
      foreach (SupEquipementViewModel c in _dataGrid.ItemsSource) 
       c.Supprime = 1; 
    } 

與XAML

<DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True"> 
       <DataGridTemplateColumn.HeaderTemplate> 
        <DataTemplate> 
         <CheckBox x:Name="chkMailAll" Content="{DynamicResource String.EquipmentView.CheckEnvoiMail}" 
            Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.HeaderTemplate> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding EnvoiMail,UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True"> 
       <DataGridTemplateColumn.HeaderTemplate> 
        <DataTemplate> 
         <CheckBox x:Name="chkActiveAll" Content="{DynamicResource String.EquipmentView.CheckActif}" 
            Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.HeaderTemplate> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding Actif,UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Width="Auto" CanUserSort="True" CanUserResize="True"> 
       <DataGridTemplateColumn.HeaderTemplate> 
        <DataTemplate> 
         <CheckBox x:Name="chkRemoveAll" Content="{DynamicResource String.EquipmentView.CheckDeleted}" 
            Checked="chkAll_Checked" Unchecked="chkAll_Unchecked" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.HeaderTemplate> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding Supprime,UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn>