我有一个看似简单的任务,这让我头疼,并且希望得到一些帮助。
我要完成的工作是将两个 bool 值绑定(bind)到两个RadioButton
的IsChecked属性,共享相同的GroupName
(因此一次仅检查一个)。
我面临的问题是,当ContentPresenter的内容即将更改时(通过绑定(bind)到ComboBox的SelectedItem),当前内容会收到对属性 setter 的调用,该调用具有相同属性的值,但从 View 即将成为新内容的模型。 (!)最终结果是,尽管没有单击绑定(bind)到所讨论属性的RadioButton,但 View 模型仍然发生了变化。
我放了together a sample app来显示问题。要重现,请运行该应用程序并按照以下步骤操作:
如果在#3和#4之间,您首先在组合框中选择“两个”,以使ContentPresenter显示另一个 View (通过DataTemplate选择),则不会出现问题!
有人可以解释一下为什么ContentPresenter交换 View 时在第4步设置该属性的原因,该怎么办?
最佳答案
DataTemplates已缓存,因此One
和Three
使用完全相同的UserControl
。您可以通过向控件添加Loaded
事件并在选项之间进行切换来验证这一点。
当您切换到Two
并返回Three
时,WPf会简单地从缓存中重新绘制该项目,但是切换到One
然后又返回Three
,它将更改该对象后面的DataContext
。我认为这是引起问题的原因,因为它似乎在删除DataContext之前先清除了第2个RadioButton IsChecked,所以最终结果是Property2设置为false。如果One
和Three
都选择了第二个单选按钮,则不会发生这种情况。
通常在这种情况下,我将使VM包含ObservableCollection<T> Items
和int SelectedIndex
。然后,我将使用ListBox
绘制UI,该代码已被覆盖以使用RadioButtons作为项目。这样,一次只能选择一个项目,并且只有一个属性可以存储所选项目。