[英]WPF DependencyProperty and data binding
我正在从事WPF项目。 我创建一个包含组合框的用户控件; 代表布尔值(真或假)。 我为我的用户控件注册了DependencyProperty
Value
。
每当组合框选择更改时,我都会更新Value
属性,并且当Value
属性更新时,我也会更新组合框。
但是我在MVVM中使用用户控件时发现了问题。 我在ViewModel中将Value
属性与IsEnable
属性绑定。 我将绑定模式设置为TwoWay
绑定。 但是,当我在comboBox中更改选择时,永远不会设置IsEnable
属性。
我的用户控件:
public bool Value
{
get { return (bool)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(bool),
typeof(BooleanComboBox),
new UIPropertyMetadata(true, OnValuePropertyChanged));
private void Cmb_Selection_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cmb = sender as ComboBox;
object selectedValue = cmb.SelectedValue;
if (selectedValue == null)
{
this.Value = false;
}
else
{
if (selectedValue.GetType() == typeof(bool))
{
this.Value = (bool)selectedValue;
}
else
{
this.Value = false;
}
}
if (this.OnValueChange != null)
this.OnValueChange(this, this.Value);
}
private static void OnValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
BooleanComboBox self = sender as BooleanComboBox;
self.Cmb_Selection.SelectedValue = (bool)args.NewValue;
}
在我放置用户控件的窗口中(我已经将用户控件的datacontext设置为我的viewModel):
<tibsExtControl:BooleanComboBox Grid.Row="4"
Grid.Column="1"
VerticalAlignment="Center"
Value="{Binding Path=NewTemporaryZone.IsEnable,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
x:Name="Cmb_AllowNonLBILogon"/>
在我的模型类中,我声明了IsEnable
属性:
private bool _isEnable;
public bool IsEnable
{
get { return _isEnable; }
set
{
_isEnable= value;
OnPropertyChanged("IsEnable");
}
}
我的用户控件怎么了。 我想念什么吗? 请帮我。 TT
请检查VS的输出窗口中是否存在任何绑定错误。
尝试刷新Cmb_Selection_SelectionChanged
的绑定。 就像是:
BindingExpression b = cmb.GetBindingExpression(MyNamespace.ValueProperty);
b.UpdateSource();
我遇到了同样的问题; 具有布尔依赖项属性! 尝试将bool
切换为INullable<bool>
( bool?
)并应用适当的类型转换。 这对我有用。 不知道这是否是错误,或者在创建依赖项属性时,与引用类型相比,值类型的处理方式是否有所不同? 也许其他人可以验证这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.