代码中未定义的UIF元素中定义的WPF数据绑定问题
-
03-07-2019 - |
题
我需要在代码中定义新的UI元素以及数据绑定,因为它们将在运行时之后实现。这是我想要做的简化版本。
数据模型:
public class AddressBook : INotifyPropertyChanged
{
private int _houseNumber;
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string sProp)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(sProp));
}
}
}
代码绑定:
AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456; // Text block displays "123" but PropertyChanged event fires
首次绑定数据时,将使用正确的门牌号更新文本块。然后,如果我稍后在代码中更改门牌号,则会触发本书的PropertyChanged事件,但不会更新文本块。谁能告诉我为什么?
谢谢, 本
解决方案
它的根源是我传递给PropertyChangedEventArgs的字符串与该属性的名称不完全匹配。我有这样的事情:
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNum"); }
}
它应该是这样的:
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
糟糕!感谢你推动正确的方向。
其他提示
确保您正在更新绑定中使用的 AddressBook
引用,而不是其他 AddressBook
引用。
我使用您提供的AddressBook代码了解以下内容。
<StackPanel>
<Button Click="Button_Click">Random</Button>
<Grid x:Name="myGrid">
</Grid>
</StackPanel>
代码背后:
public partial class Window1 : Window
{
private AddressBook book;
public Window1()
{
InitializeComponent();
book = new AddressBook();
book.HouseNumber = 13;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
tb.SetBinding(TextBlock.TextProperty, bind);
myGrid.Children.Add(tb);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Random rnd = new Random();
book.HouseNumber = rnd.Next();
}
}
请注意,更新代码中使用了相同的参考。
您是否需要以编程方式设置绑定模式?它可能默认为OneTime。
我刚刚剪切并粘贴了你的代码(并添加了一点),它对我来说很好用:
public Window1()
{
InitializeComponent();
AddressBook book = new AddressBook();
book.HouseNumber = 123;
TextBlock tb = new TextBlock();
Binding bind = new Binding("HouseNumber");
bind.Source = book;
bind.Mode = BindingMode.OneWay;
tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
myGrid.Children.Add(tb);
book.HouseNumber = 456;
}
private void TestButton_Click(object sender, RoutedEventArgs e)
{
AddressBook book =
(AddressBook(TextBlock)
myGrid.Children[0])
.GetBindingExpression(TextBlock.TextProperty)
.DataItem;
book.HouseNumber++;
}
启动时显示456,单击该按钮可使TextBlock中的数字增量正常。
也许你在错误的地方寻找问题的原因?
您确定要更新与绑定中使用的对象相同的对象吗?乍一看,没有什么看错,所以检查简单的事情。 :)
是否有任何代码绕过该属性,直接设置字段( _houseNumber
)?
不隶属于 StackOverflow