0

我想在我的项目中开始使用 MVVM,所以我开始研究它。当我在 WPF 上玩了一下时,我遇到了一个错误,我自己和探索互联网时都找不到他的解决方案。

我有类似的东西(我无法粘贴我的完整代码,因为它不在同一个网络中):

主视图.Xaml

<ListBox ItemsSource="{Binding Persons}">
 <ListBox.ItemTemplate>
  <DataTemplate>
   <CheckBox Content="{Binding Name}">
    <i:Interaction.Triggers>
     <i:EventTrigger EventName="Checked">
        <my:AddToInvitation />
     </i:EventTrigger>
     <i:EventTrigger EventName="Unchecked">
        <my:RemoveFromInvitation />
     </i:EventTrigger>
    </i:Interaction.Triggers>
   </CheckBox>
  </DataTemplate>
</ListBox.ItemTemplate>

主视图模型.cs

public ObservableCollection<PersonViewModel> Persons { get; set; }

public MainViewModel()
{
  this.Persons = new ObservableCollection<PersonViewModel>();
  for(int i=0;i<1000;i++)
  {
     PersonViewModel personVM = new PersonViewModel (string.Format("Person - {0}",i));
     this.Persons.add(personVM);
  }
}

PersonViewModel.cs

private Person PersonObject { get; set; }

public string Name
{
  get
  {
     return this.PersonObject.Name;
  }
}

public PersonViewModel(string personName)
{
  this.PersonObject = new Person(personName);
}

个人.cs

public string Name { get; set; }

public Person(string name)
{
   this.Name = name;
}

现在,如果您尝试粘贴并运行它,它看起来会很好。问题是当您尝试以下说明时:

1) Check the first 10 persons in the ListBox.
2) Scroll down the ListBox to the bottom of it.
3) Leave the mouse when the list box is scrolled down.
4) Scroll back up to the top of the ListBox.
5) Poof! you'r checking disappeared.

现在我找到的解决方案是将 IsChecked 属性(虽然我并不真正需要它)添加到 PersonViewModel 并将其绑定到 CheckBox IsChecked DependencyProperty,但随后我添加了一个功能,让用户按下按钮它将遍历 ListBox 中的所有人员并将其 IsChecked 属性更改为 true(Button -> Select all)。在消失检查错误之后,我遇到了另一个错误,我认为它以某种方式与消失的检查有关 - 我在发生检查和取消检查时触发的操作只会在您全选时触发某些复选框。

如果你不尝试它有点难以理解这个错误,所以只有当你尝试过时才请在这里评论。

提前致谢!

4

1 回答 1

0

简单的答案是:你在逆流而上。

绑定是关于更改 ViewModel 中的值并允许您针对简单的视图模型类编写代码,以便您的表示逻辑没有业务逻辑。在您的示例中,执行的决定 AddToInvitation RemoveFromInvitation在您看来,不应该存在。

你会很好地使用bool IsInvited{get;set;}易于绑定到复选框的属性(不需要依赖属性)。这将允许用户更改保留在您的视图模型中。如果您需要一些其他更复杂的逻辑,您应该附加到您的 ViewModel 必须实现的PropertyChagned事件表单接口。INotifyPropertyChanged然后您可以随意更改简单类中的属性,ui 将相应更新。

于 2012-10-29T08:41:56.890 回答