我有一个看似简单的任务,这让我头疼,并且希望得到一些帮助。

我要完成的工作是将两个 bool 值绑定(bind)到两个RadioButton的IsChecked属性,共享相同的GroupName(因此一次仅检查一个)。

我面临的问题是,当ContentPresenter的内容即将更改时(通过绑定(bind)到ComboBox的SelectedItem),当前内容会收到对属性 setter 的调用,该调用具有相同属性的值,但从 View 即将成为新内容的模型。 (!)最终结果是,尽管没有单击绑定(bind)到所讨论属性的RadioButton,但 View 模型仍然发生了变化。

我放了together a sample app来显示问题。要重现,请运行该应用程序并按照以下步骤操作:

  • 在组合框中选择“一个” =>选中MyPropery,不选中MyProperty2。
  • 在组合框中选择“三” =>选中MyPropery,不选中MyProperty2。
  • 仍然选择“三”时,单击MyProperty2 => MyProperty2已选中(也在调试输出窗口中指示)
  • 在组合框中选择“一个” =>选中MyPropery,不选中MyProperty2。注意调试窗口如何显示对象“Three”的MyProperty2在此处如何设置为false
  • 在组合框中选择“三” =>现在未选中任何一个单选按钮(由于#4)。

  • 如果在#3和#4之间,您首先在组合框中选择“两个”,以使ContentPresenter显示另一个 View (通过DataTemplate选择),则不会出现问题!

    有人可以解释一下为什么ContentPresenter交换 View 时在第4步设置该属性的原因,该怎么办?

    最佳答案

    DataTemplates已缓存,因此OneThree使用完全相同的UserControl。您可以通过向控件添加Loaded事件并在选项之间进行切换来验证这一点。

    当您切换到Two并返回Three时,WPf会简单地从缓存中重新绘制该项目,但是切换到One然后又返回Three,它将更改该对象后面的DataContext。我认为这是引起问题的原因,因为它似乎在删除DataContext之前先清除了第2个RadioButton IsChecked,所以最终结果是Property2设置为false。如果OneThree都选择了第二个单选按钮,则不会发生这种情况。

    通常在这种情况下,我将使VM包含ObservableCollection<T> Itemsint SelectedIndex。然后,我将使用ListBox绘制UI,该代码已被覆盖以使用RadioButtons作为项目。这样,一次只能选择一个项目,并且只有一个属性可以存储所选项目。

    10-08 11:38