2011-11-04 108 views
1

我有一個顯示爲列表框的項目列表。帶有複選框的ListView

<ListView ItemsSource="{Binding ListOfSomeItems}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/> 
      <GridViewColumn Header="Status"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsReceived}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

現在有2例用戶我需要實現:

1)當用戶所收到(該複選框接受檢查),我需要更新的項目標誌的項目。我應該如何將檢查的事件綁定到我的ViewModel中的ICommand?

2)當用戶試圖刪除接收到的標誌(取消選中複選框)時,應該彈出一個選項來取消操作(如果有人點擊了複選框)或者提供一個原因說明。該註釋以及未被選中的項目應該發送到虛擬機中的不同ICommand。

有什麼建議嗎?

在此先感謝

UPDATE: 我的視圖模型做農具INoftiyPropertyChanged,但我沒有對單個項目屬性。該屬性嵌套在複雜的類中:類似於Account.Holders [x] .Requirements [y] .IsReceived。

+0

關於問題1,你不必使用一個ICommand。當用戶檢查CheckBox時,在VM中調用屬性Set方法。 – jpsstavares

+0

@jpsstavares - 該屬性嵌套在複雜類中:類似於Account.Holders [x] .Requirements [y] .IsReceived。我最好執行一個命令而不是遍歷層次結構。 –

回答

0
  1. 爲什麼只是不綁定應該由視圖模型暴露的命令:
<CheckBox 
    Command="{Binding ReceivedStatusChangedCommand}" 
    CommandParameter="{Binding ...IsReceived}" 
/> 

然後在命令處理程序,你可以分析IsReceived的值作爲命令參數傳遞。

+0

我希望看到一個涵蓋兩種用戶案例的解決方案。 –

0

你的ViewModel應該實現INoftiyPropertyChanged。只需聆聽PropertyChanged事件並對其作出響應。

編輯

根據您的視圖模型的結構,如果客戶需要響應的要求,它可能是最好使用類似棱鏡的EventAggregator或MVVM光的使者。

+0

查看我的問題更新 –

-1

MVVM的解決辦法是:

  1. 由於綁定兩種方式,你不需要做任何事情,你的對象從UI更新。但是,如果你想讓你的UI更新模型的變化,你的模型類需要實現INotifyPropertyChanged
  2. 我想這將在IsReceived setter中完成。將兩個字段添加到您的模型類。

public string ValidationError 
{ get; set; } 

public bool HasValidationError 
{ get; set; } 

然後創建與默認是隱藏的錯誤彈出。在班級中實施INotifyPropertyChanged,並將彈出窗口的可見性綁定到HasValidationError,並將內部TextBlockValidationError的消息綁定。

+0

查看對我的問題的更新 –

+0

有沒有特定的情況下,這不會仍然適用?同樣的邏輯應該是可行的。如果有什麼事情使得這個變得非常複雜,你應該考慮創建ViewModel,它可以做任何需要的計算或層次遍歷,並且可以很容易綁定。 –

0

由於您綁定了對象中的IsChecked屬性,因此可以簡單地偵聽該對象的PropertyChanged事件,並在其更改時調用所需的任何方法。

例如,

// Wireup CollectionChanged in Constructor 
public MyVMConstructor() 
{ 
    ListOfSomeItems = new List<SomeItem>(); 
    ListOfSomeItems.CollectionChanged += ListOfSomeItems_CollectionChanged; 
} 

// In CollectionChanged event, wire up PropertyChanged event on items 
void ListOfSomeItems_CollectionChanged(object sender, CollectionChangedEventArgs e) 
{ 
    if (e.NewItems != null) 
    { 
     foreach(SomeItem item in e.NewItems) 
      item.PropertyChanged += SomeItem_PropertyChanged; 
    } 
    if (e.OldItems != null) 
    { 
     foreach(SomeItem item in e.OldItems) 
      item.PropertyChanged -= SomeItem_PropertyChanged; 
    } 
} 

// In PropertyChanged, if property was IsReceived then verify and update 
void SomeItem_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "IsReceived") 
    { 
     if (MessageBox.Show("Are you sure?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      var item = sender as SomeItem; 
      UpdateSomeItem(item.Id, item.IsReceived); 
     } 
    } 
}