WPF : MvvmLight, Usercontrol, Binding
本文关键字:Usercontrol Binding MvvmLight WPF | 更新日期: 2023-09-27 18:18:16
我有一个简单的用户控件(DoubleRadioControl2),由2个单选按钮组成。我在这个UC上有一个副道具:(bool?)IsOuiChecked:
- true - 'yes'选中
- false -选中"no"单选
- null -两者都有收音机不
相当简单。
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绑定到我的视图模型时,当我点击我的无线电时,绑定的道具就会更新。但是当我在视图模型的代码中设置值时,它不会更新我的无线电。
In my viewmodel:
private bool? _isDRB2OuiChecked;
public bool? IsDRB2OuiChecked
{
get
{
return _isDRB2OuiChecked;
}
set
{
if (_isDRB2OuiChecked == value)
{
return;
}
_isDRB2OuiChecked = value;
RaisePropertyChanged(() => IsDRB2OuiChecked);
}
}
双向绑定不工作
依赖属性的getter和setter仅为您的(程序员)方便而存在。WPF本身不会调用它们,而是直接设置属性。
您需要将处理程序附加到属性的已更改事件。使用FrameworkPropertyMetadata
构造函数之一,它接受PropertyChangedCallback。你的getter和setter逻辑需要在那里处理,而不是在属性中。
如果你正在使用MVVM,你应该调用OnPropertyChanged
首先,这是一个非常坏的做法,把代码放在依赖属性的Get/Set部分,看看这些例子来获得解决方案。如果您对DP进行了逻辑更改,则必须将该登录放在回调中。
- 依赖属性解释在这里。
- MSDN概述在这里。
如果在视图/视图模型级别定义了绑定,你必须在视图模型端使用INotifyPropertyChange事件来通知视图绑定的属性被更改。
认为,