属性 在更改用户控件依赖项时重置属性
Property resets when changing Usercontrols DependencyProperty
我构建了一个“Widgets”的“Manager”,其中我有一个 ListView/GridView 和 widgets。
ListView 将 SelectedItem 绑定到(Manager)ViewModel 上的 SelectedWidget 属性。
SelectedWidget 通过名为“Widget”的 DependencyProperty 绑定到名为 WidgetConfig 的用户控件,您可以在其中修改 selected Widget 的属性。
在 WidgetConfig 中,有 2 个单选按钮:
<RadioButton GroupName="Lead" IsChecked="{Binding Widget.prop1, Mode=TwoWay, ElementName=root}" />
<RadioButton GroupName="Lead" IsChecked="{Binding Widget.prop2, Mode=TwoWay, ElementName=root}" />
当我 select 'prop2' 时,INPC 信号被正确发送,模型也相应更新。如果然后我点击 'prop1',INPC 信号被发送 + 我从 prop2 单选按钮得到一个额外的信号。
问题来了:
if i select prop2 然后 select ListView 中的另一个 Widget。我收到一个 INPC 信号,prop2 变回 false!
怎么回事?
一些信息:
- WidgetConfiguration 是使用 PostSharp NotifyPropertyChanged 方面实现的。
- WidgetConfig UserControl 是通过 DependencyProperty 和 INotifyPropertyChanged 接口手工实现的
编辑:
我在这里创建了一个可重现的示例:https://github.com/Montago/INCP-DP-BindingExample
您拥有的是双向绑定链,它们正在改变您模型上的值:
ListControl.SelectedItem(DP) 和 ViewModel.SelectedModel(INPC) 之间的双向绑定。
ViewModel.SelectedModel(INPC) 和 ModelControl.ActiveModel(DP) 之间的双向绑定。
ModelControl.ActiveModel(DP) 与 Model.Prop1/Model.Prop2/Model.Name(INPC).
双向绑定
当您 select First, Second 然后再 First, Second 的 prop2 被 WPF 数据绑定覆盖为 false。
解决此问题的一种方法是删除覆盖 prop2 的双向绑定,即在 RadioButton 绑定上指定 Mode=OneWay。
我对正在发生的事情的猜测:RadioButton 的逻辑和双向绑定。当列表框中的 selected 并且您将 selection 更改为 First 时,WPF 的数据绑定将 Prop1 单选按钮设置为 selected(因为 First.prop1 == true)。此时,第二个单选按钮仍处于 selected 状态,因此为了遵守分组原则,需要取消 selected。但是,Prop2 无线电上仍然存在双向绑定,因此 Second.prop2 设置为 false。
我构建了一个“Widgets”的“Manager”,其中我有一个 ListView/GridView 和 widgets。
ListView 将 SelectedItem 绑定到(Manager)ViewModel 上的 SelectedWidget 属性。
SelectedWidget 通过名为“Widget”的 DependencyProperty 绑定到名为 WidgetConfig 的用户控件,您可以在其中修改 selected Widget 的属性。
在 WidgetConfig 中,有 2 个单选按钮:
<RadioButton GroupName="Lead" IsChecked="{Binding Widget.prop1, Mode=TwoWay, ElementName=root}" />
<RadioButton GroupName="Lead" IsChecked="{Binding Widget.prop2, Mode=TwoWay, ElementName=root}" />
当我 select 'prop2' 时,INPC 信号被正确发送,模型也相应更新。如果然后我点击 'prop1',INPC 信号被发送 + 我从 prop2 单选按钮得到一个额外的信号。
问题来了: if i select prop2 然后 select ListView 中的另一个 Widget。我收到一个 INPC 信号,prop2 变回 false!
怎么回事?
一些信息:
- WidgetConfiguration 是使用 PostSharp NotifyPropertyChanged 方面实现的。
- WidgetConfig UserControl 是通过 DependencyProperty 和 INotifyPropertyChanged 接口手工实现的
编辑:
我在这里创建了一个可重现的示例:https://github.com/Montago/INCP-DP-BindingExample
您拥有的是双向绑定链,它们正在改变您模型上的值:
ListControl.SelectedItem(DP) 和 ViewModel.SelectedModel(INPC) 之间的双向绑定。
ViewModel.SelectedModel(INPC) 和 ModelControl.ActiveModel(DP) 之间的双向绑定。
ModelControl.ActiveModel(DP) 与 Model.Prop1/Model.Prop2/Model.Name(INPC).
双向绑定当您 select First, Second 然后再 First, Second 的 prop2 被 WPF 数据绑定覆盖为 false。
解决此问题的一种方法是删除覆盖 prop2 的双向绑定,即在 RadioButton 绑定上指定 Mode=OneWay。
我对正在发生的事情的猜测:RadioButton 的逻辑和双向绑定。当列表框中的 selected 并且您将 selection 更改为 First 时,WPF 的数据绑定将 Prop1 单选按钮设置为 selected(因为 First.prop1 == true)。此时,第二个单选按钮仍处于 selected 状态,因此为了遵守分组原则,需要取消 selected。但是,Prop2 无线电上仍然存在双向绑定,因此 Second.prop2 设置为 false。