【发布时间】:2017-03-13 14:43:42
【问题描述】:
我创建了一个自定义控件,其依赖属性绑定到视图模型属性。
<wpf1:CustomTextBox StringProperty="{Binding StringValue}" />
视图模型如下所示
public class ViewModel : INotifyPropertyChanged
{
public string StringValue
{
get { return m_stringValue; }
set
{
m_stringValue = value;
OnPropertyChanged("StringValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string m_stringValue;
}
DataContext在后面的代码中设置
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
DataContext = ViewModel = new ViewModel();
}
public ViewModel ViewModel { get; set; }
}
依赖属性的绑定方式默认是两种方式
public static readonly DependencyProperty StringPropertyProperty =
DependencyProperty.Register(
"StringProperty",
typeof(string),
typeof(CustomTextBox),
new FrameworkPropertyMetadata
{
BindsTwoWayByDefault = true,
DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
PropertyChangedCallback = PropertyChangedCallback
});
现在我遇到了问题,当视图模型属性 StringValue 更改时,自定义控件会收到通知,但是当我更改依赖属性的值时,视图模型的值不会更改。
private static void PropertyChangedCallback(DependencyObject dO,
DependencyPropertyChangedEventArgs e)
{
var textBox = (CustomTextBox) dO;
if (textBox.StringProperty == null)
return;
DoSomething(textBox.StringProperty)
textBox.StringProperty = null;
}
如果我将视图模型值设置为“某个值”,我希望自定义控件使用该字符串并将其重置为 null。到目前为止,这可行,但视图模型值未同步,并且保持“某个值”而不是 null。任何想法如何做到这一点?为什么双向绑定不起作用?
谢谢。
【问题讨论】:
-
O/T,但
public ViewModel ViewModel { get { return DataContext as ViewModel; } set { DataContext = value; } }让您不必担心保持类型属性与DataContext同步。
标签: c# wpf data-binding dependency-properties