2013-04-08 48 views
3

在視圖,即XAML,我已在全選布爾值綁定到CheckBox控件在WPF/MVVM,如何實現以完美的方式

<CheckBox Grid.Row="5" Content="Select All" HorizontalAlignment="Left" Margin="0,5, 0, 0" IsChecked="{Binding Path=SelectAll, Mode=TwoWay}" Width="206"></CheckBox> 

「全選」功能和fullfill的全選作爲

public bool SelectAll 
    { 
     get { return this.Get<bool>("SelectAll"); } 
     set 
     { 
      this.Set<bool>("SelectAll", value); 
      if (this.SelectAllCommand.CanExecute(null)) 
       this.SelectAllCommand.Execute(value); 
     } 
    } 

是的,它看起來不錯,但我有一個問題...

當所有的複選框被手動選擇,在全選複選框應自動選擇......在那個時候,我們不不想要SelectAllCommand要執行的命令......

我該怎麼辦呢.....我知道也許這是一件容易的事,但如何完美地做到這一點....

謝謝你給我一些提前

+0

你一定希望SelectedAll屬性是可空 Aron 2013-04-08 07:15:36

+0

BTW是什麼this.Set/this.Get? – Aron 2013-04-08 07:21:46

+0

他只是想「當所有的複選框手動選擇,...」,所以這是一個很好的問題+1。確定它可以在ObservableCollection Source.CollectionChanged事件上實現。但這個問題尋找最佳做法。 – 2013-04-08 07:22:51

回答

1

建議嘗試

public bool? SelectedAll 
{ 
    get { return this.Get<bool?>("SelectedAll"); } 
    set 
    { 
     if(Equals(SelectedAll, value) == true) 
      return; 
     this.Set<bool?>("SelectedAll", value); 
     OnSelectedAllChanged(value); 
    } 
} 

private void SelectedAllChanged(bool? input) 
{ 
    //Stuff 
} 
+0

你如何管理手動選擇所有元素。那麼SelectAll的狀態會是什麼? – 2013-04-08 07:24:23

+0

哦,謝謝你的建議,但是我的領導真的不喜歡可空值,也許代碼不會通過他的評論。 :( – Miyazaki 2013-04-08 07:39:04

+1

它不是一個喜歡或不喜歡的情況,這實際上是一個三態,你可以有所有選擇/全部未選擇/混合。硬性快速規則,如「我不喜歡可空,所以應該有none「是不好的,這是一個三態的商業案例,所有的代碼都需要知道三態,替代方案是使用三態枚舉 – Aron 2013-04-08 07:48:22

0

你需要使用PropertyChanged事件項目的重新評估SelectAll值隨時選擇一個項目。

例如,

// Setup PropertyChange notification for each item in collection 
foreach(var item in MyCollection) 
{ 
    item.PropertyChanged += Item_PropertyChanged; 
} 

private bool _isSelectAllExecuting = false; 

// If the IsSelected property of an item changes, raise a property change 
// notification for SelectAll 
void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (!_isSelectAllExecuting && e.PropertyName == "IsSelected") 
     ReevaluateSelectAll(); 
} 

void ReevaluateSelectAll() 
{ 
    // Will evaluate true if no items are found that are not Selected 
    _selectAll = MyCollection.FirstOrDefault(p => !p.IsSelected) == null; 

    // Since we're setting private field instead of public one to avoid 
    // executing command in setter, we need to manually raise the 
    // PropertyChanged event to notify the UI it's been changed 
    RaisePropertyChanged("SelectAll"); 
} 

void SelectAll() 
{ 
    _isSelectAllExecuting = true; 

    foreach(var item in MyCollection) 
     item.IsSelected = true; 

    _isSelectAllExecuting = false; 
} 
+0

我不明白當所有選擇的項目觸發時如何管理Selectall->所以,當SelectAll「Select All items Action」---繼續時,Stack Over Flow會發生,也許我們需要一些布爾或類似的東西來處理手動或自動選擇的SelectAll – 2013-04-09 05:46:34

+0

@DavutGürbüz通常我的setter會檢查if (_field!= value)',只更新私有字段並在值發生變化時引發'PropertyChange'通知。從'true'更改爲'true'不應引發'PropertyChange'通知。它會提高PropertyChange noti過於頻繁。在這些情況下,我傾向於使用私人布爾來禁用通知,而一切都在更新(我會更新我的答案) – Rachel 2013-04-09 11:56:15

相關問題