WPF:MvvmLight、用户控件、绑定
WPF : MvvmLight, Usercontrol, Binding
我有一个简单的用户控件 (DoubleRadioControl2),由 2 个单选按钮组成。我在这个 UC 上有一个 Dep Prop : (bool?)IsOuiChecked :
- true - 'yes' 收音机已检查
- false - 'no' 无线电检查
- 空 - 两者
收音机未选中
很简单。
private static readonly DependencyProperty IsOuiCheckedProperty = DependencyProperty.Register("IsOuiChecked", typeof(bool?), typeof(DoubleRadioControl2), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public bool? IsOuiChecked
{
get
{
return (bool)GetValue(IsOuiCheckedProperty);
}
set
{
SetValue(IsOuiCheckedProperty, value);
if (value == null)
{
RadioYes.IsChecked = false;
RadioNo.IsChecked = false;
}
else
{
RadioYes.IsChecked = (bool) value;
RadioNo.IsChecked = !(bool) value;
}
}
}
这两个收音机之间的逻辑:
private void OptDecompteConfnOui_Click(object sender, RoutedEventArgs e)
{
IsOuiChecked = true;
}
private void OptDecompteConfnNon_Click(object sender, RoutedEventArgs e)
{
IsOuiChecked = false;
}
当我将此 UC 绑定到我的视图模型时,如果在我单击收音机时更新了绑定的道具。但是当我在视图模型的代码中设置值时,它不会更新我的收音机。
在我的视图模型中:
private bool? _isDRB2OuiChecked;
public bool? IsDRB2OuiChecked
{
get
{
return _isDRB2OuiChecked;
}
set
{
if (_isDRB2OuiChecked == value)
{
return;
}
_isDRB2OuiChecked = value;
RaisePropertyChanged(() => IsDRB2OuiChecked);
}
}
TwoWay 绑定无效。
如果您使用的是 MVVM,则应调用 OnPropertyChanged
getters 和 setters 为您的依赖项 属性 存在只是为了 您的(程序员)方便。 WPF本身不会调用它们,而是直接设置属性。
您需要将处理程序附加到 属性 的更改事件。使用带有 PropertyChangedCallback 的 FrameworkPropertyMetadata
构造函数之一。您的 getter 和 setter 逻辑需要在那里处理,而不是在 属性.
内部处理
首先,这是一个非常糟糕的做法,将代码放入依赖项 Get/Set 的部分 属性,查看这些示例以获得解决方案。如果您有 DP 更改的逻辑,则必须将该登录放在回调中。
如果在 View/Viewmodel 级别定义了绑定,则必须在 Viewmodel 端使用 INotifyPropertyChange 事件来通知 View 绑定 属性 已更改。
问候,
我有一个简单的用户控件 (DoubleRadioControl2),由 2 个单选按钮组成。我在这个 UC 上有一个 Dep Prop : (bool?)IsOuiChecked :
- true - 'yes' 收音机已检查
- false - 'no' 无线电检查
- 空 - 两者 收音机未选中
很简单。
private static readonly DependencyProperty IsOuiCheckedProperty = DependencyProperty.Register("IsOuiChecked", typeof(bool?), typeof(DoubleRadioControl2), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public bool? IsOuiChecked
{
get
{
return (bool)GetValue(IsOuiCheckedProperty);
}
set
{
SetValue(IsOuiCheckedProperty, value);
if (value == null)
{
RadioYes.IsChecked = false;
RadioNo.IsChecked = false;
}
else
{
RadioYes.IsChecked = (bool) value;
RadioNo.IsChecked = !(bool) value;
}
}
}
这两个收音机之间的逻辑:
private void OptDecompteConfnOui_Click(object sender, RoutedEventArgs e)
{
IsOuiChecked = true;
}
private void OptDecompteConfnNon_Click(object sender, RoutedEventArgs e)
{
IsOuiChecked = false;
}
当我将此 UC 绑定到我的视图模型时,如果在我单击收音机时更新了绑定的道具。但是当我在视图模型的代码中设置值时,它不会更新我的收音机。
在我的视图模型中:
private bool? _isDRB2OuiChecked;
public bool? IsDRB2OuiChecked
{
get
{
return _isDRB2OuiChecked;
}
set
{
if (_isDRB2OuiChecked == value)
{
return;
}
_isDRB2OuiChecked = value;
RaisePropertyChanged(() => IsDRB2OuiChecked);
}
}
TwoWay 绑定无效。
如果您使用的是 MVVM,则应调用 OnPropertyChanged
getters 和 setters 为您的依赖项 属性 存在只是为了 您的(程序员)方便。 WPF本身不会调用它们,而是直接设置属性。
您需要将处理程序附加到 属性 的更改事件。使用带有 PropertyChangedCallback 的 FrameworkPropertyMetadata
构造函数之一。您的 getter 和 setter 逻辑需要在那里处理,而不是在 属性.
首先,这是一个非常糟糕的做法,将代码放入依赖项 Get/Set 的部分 属性,查看这些示例以获得解决方案。如果您有 DP 更改的逻辑,则必须将该登录放在回调中。
如果在 View/Viewmodel 级别定义了绑定,则必须在 Viewmodel 端使用 INotifyPropertyChange 事件来通知 View 绑定 属性 已更改。
问候,