2011-11-04 109 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); 
     } 
    } 
}