RadioButton 的绑定问题

Per*_*Per 5 c# data-binding wpf

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

我想要完成的是将两个布尔值绑定到两个RadioButtons的 IsChecked 属性,共享相同的值GroupName(因此一次只检查一个)。

我面临的问题是,当 ContentPresenter 的内容即将更改时(通过绑定到 ComboBox 的 SelectedItem),当前内容会收到对具有相同属性值但来自视图的属性设置器的调用即将成为新内容的模型。(!) 最终结果是,尽管没有单击绑定到相关属性的 RadioButton,视图模型还是发生了变化。

我已经整理了一个显示问题的示例应用程序。要重现,请运行该应用程序并按照以下步骤操作:

  1. 在组合框中选择“一”=> MyPropery 已选中,MyProperty2 未选中。
  2. 在组合框中选择“三”=> MyPropery 已选中,MyProperty2 未选中。
  3. 在仍然选择“三个”的同时,单击 MyProperty2 => MyProperty2 已选中(也在调试输出窗口中指示)
  4. 在组合框中选择“一”=> MyPropery 已选中,MyProperty2 未选中。请注意调试窗口如何显示对象“三”的 MyProperty2 在这里设置为 false
  5. 在组合框中选择“三个”=> 现在没有选中单选按钮(由于 #4)。

如果在#3 和#4 之间,首先在组合框中选择“Two”,让ContentPresenter 显示另一个视图(通过DataTemplate 选择),则不会出现问题!?

有人可以解释为什么当 ContentPresenter 交换视图时在第 4 步设置属性,以及可以做些什么?

Rac*_*hel 1

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

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

通常在这种情况下,我会让虚拟机包含一个ObservableCollection<T> Items和一个int SelectedIndex. ListBox然后,我将使用已被覆盖以使用单选按钮来显示项目的UI 来绘制 UI 。这样一次只能选择一个项目,并且只有一个属性用于存储所选择的项目。