2012-09-26 20 views
2

Iam使用MVVM與WPF ...我有一個checkedlistbox與一些項目....每次一個項目被檢查,我希望該項目是在視圖模型中使用....是否有一個屬性或命令或事件,這樣我可以用它來了解checkeditem ...事件或命令知道每次從Checkedlistbox使用mvvm,wpf選擇一個項目

這是我的XAML ...

<ListBox Grid.Row="9" Height="49" HorizontalAlignment="Left" Margin="0,30,0,0"  Name="aasdasd" VerticalAlignment="Top" Width="205" SelectionMode="Multiple" 
      ItemsSource="{Binding userlist}" Grid.Column="1"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <CheckBox Name="chkuser" Content="{Binding Path=useritem}" IsChecked="{Binding IsChecked,Mode=TwoWay}" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

感謝

回答

1

如果userList中的項目實施INotifyPropertyChanged,則您的視圖模型可能會爲IsChecked屬性更改爲true時,爲列表中的每個項目(確保它使用weak events或正確取消訂閱事件)和觀察者訂閱PropertyChanged事件。

或者,您可以使用Checked事件上的事件觸發器在視圖模型中執行命令。

1

您綁定到IsChecked你的模型,讓您的視圖模型可以直接訂閱PropertyChanged事件該項目,並執行任何你想要的動作,當該屬性更改

public MyViewModel() 
{ 
    userList.CollectionChanged += userList_CollectionChanged; 
} 

void userList_CollectionChanged(object sender, CollectionChangedEventArgs e) 
{ 
    if (e.NewItems != null) 
     foreach(MyItem item in e.NewItems) 
      item.PropertyChanged += MyItem_PropertyChanged; 

    if (e.OldItems != null) 
     foreach(MyItem item in e.OldItems) 
      item.PropertyChanged -= MyItem_PropertyChanged; 
} 

void MyItem_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "IsChecked") 
    { 
     // Do whatever here 
    } 
} 
+0

根據不同的位置和壽命「userList」及其項目,你認爲使用WeakEvent模式訂閱CollectionChanged和PropertyChanged事件會有意義嗎?當然,除非MyViewModel運行某種退訂的清理代碼。據我瞭解,如果userList中的對象的生命週期比「MyViewModel」的生命週期長,那麼它將因爲視圖模型無法最終確定而泄漏。如果我錯了,請糾正我。 – Thelonias

相關問題