我有以下标记。
<TextBox x:Name="Address"
Text="{Binding
Source={x:Static local:MainWindow.Boundie},
Path=SomeProp,
Mode=TwoWay}">
</TextBox>
在后面的代码中我有一个像这样的静态属性。
Boundie = new Something { SomeProp = "old" };
static Something Boundie { get; set; }
public class Something { public String SomeProp { get; set; } }
我原以为如果在数据绑定文本框和断点中输入“new”,属性的属性就会改变。事实并非如此。我用错误的方式使用模式吗?或者除了将其设置为 TwoWay 之外,我还需要做其他任何事情吗?或者这种方法在这种情况下是否合适?
答案 0 :(得分:1)
您的.xaml
应如下所示:
<TextBox x:Name="Address"
Text="{Binding Path=Boundie.SomeProp, Mode=TwoWay}">
</TextBox>
您的.cs
应如下所示:
public class YourClass : INotifyPropertyChanged
{
private Boundie _boundie;
// You need Boundie to be public
public Boundie
{
get;
set
{
_boundie = value;
OnPropertyChanged("Boundie");
}
}
public Main()
{
Boundie = new Something { SomeProp = "old" };
// Initialize component AFTER you initialized your attribute
InitializeComponent();
DataContext = this;
}
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
注意:您的Boundie属性(SomeProp)必须是公开的。
答案 1 :(得分:1)
如果您只需要将从 更新到到数据对象,则实施INotifyPropertyChanged
并非强制要求。
正如Sonhja所说,将Boundie属性初始化放在正确的位置是很重要的。
因此,您应该在静态构造函数中或Boundie = new Something { SomeProp = "old" };
调用之前(在公共构造函数中)插入InitializeComponent();
。
原因很简单:如果您在Boundie = new Something { SomeProp = "old" };
调用之后InitializeComponent();
,则绑定已尝试读取Boundie属性值(此时为null)