文本框的文本更改时无法更新静态绑定属性的值
Can't update the static bound property's value when text box's text changes
我有以下标记。
<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",该属性的特性将会改变。事实并非如此。我使用 Mode 的方式有误吗?或者除了将其设置为 TwoWay 之外,我还需要做任何其他事情吗?或者这种方法在这种情况下是不合适的?
您的 .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) 必须是 public。
如果您只需要更新 从 GUI 到 数据对象,实施 INotifyPropertyChanged
不是强制性的。
正如 Sonhja 所建议的那样,将 Boundie 属性 初始化放在正确的位置很重要。
因此,您应该在静态构造函数中或在 InitializeComponent();
调用之前(在 public 构造函数中)插入 Boundie = new Something { SomeProp = "old" };
。
原因很简单:如果您 Boundie = new Something { SomeProp = "old" };
在 调用 InitializeComponent();
之后,绑定已经尝试读取 Boundie 属性值(此时为空)。
我有以下标记。
<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",该属性的特性将会改变。事实并非如此。我使用 Mode 的方式有误吗?或者除了将其设置为 TwoWay 之外,我还需要做任何其他事情吗?或者这种方法在这种情况下是不合适的?
您的 .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) 必须是 public。
如果您只需要更新 从 GUI 到 数据对象,实施 INotifyPropertyChanged
不是强制性的。
正如 Sonhja 所建议的那样,将 Boundie 属性 初始化放在正确的位置很重要。
因此,您应该在静态构造函数中或在 InitializeComponent();
调用之前(在 public 构造函数中)插入 Boundie = new Something { SomeProp = "old" };
。
原因很简单:如果您 Boundie = new Something { SomeProp = "old" };
在 调用 InitializeComponent();
之后,绑定已经尝试读取 Boundie 属性值(此时为空)。