我正在使用MVVM原则为UWP创建一个应用程序。
我有一个包含标准工具栏的页面,下面的ScrollView中的实际内容是动态的,具体取决于用户导航的位置;
<ScrollViewer>
<StackPanel Orientation="Vertical">
<ContentControl HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Content="{x:Bind viewModel.Content}">
</ContentControl>
</StackPanel>
</ScrollViewer>
我绑定到该部分的内容的简化版本如下所示:
public class Content : StackPanel
{
ContentViewModel ViewModel;
TextBlock txtInformation;
public Content()
{
Orientation = Orientation.Vertical;
ViewModel = new ContentViewModel();
txtInformation = new TextBlock();
txtInformation.SetBinding(TextBlock.TextProperty,
new Binding()
{
Mode = BindingMode.OneWay,
Source = ViewModel.Item,
Path = new
PropertyPath("Information"),
TargetNullValue = "No information found"
});
Children.Add(txtInformation);
}
}
最后,这里是内容视图模型的简化版本:
public class ContentViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
MyObject _item;
public ContentViewModel()
{
Item = new MyObject()
{
Information = "Information goes here"
};
}
public MyObject Item
{
get
{
return _item;
}
set
{
_item = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item"));
}
}
}
最初绑定似乎有效,因为当页面加载TextBlock时,“找不到信息”作为其文本值。但是当属性发生变化时,UI没有更新。
使用SetBinding()方法在C#中设置控件的绑定时,这似乎只是一个问题,而不是在XAML中使用{x:Bind}扩展名作为我的其他页面使用XAML进行正确的绑定更新。
不会抛出任何错误。
答案 0 :(得分:0)
Content="{x:Bind ViewModel.Content, Mode=Oneway}">
x:Bind的标准模式是OneTime ...仅在开始时有效......
答案 1 :(得分:0)
而不是
txtInformation.SetBinding(TextBlock.TextProperty,
new Binding()
{
Mode = BindingMode.OneWay,
Source = ViewModel.Item,
Path = new
PropertyPath("Information"),
TargetNullValue = "No information found"
});
The Source&amp; PropertyPath属性应设置如下:
txtInformation.SetBinding(TextBlock.TextProperty,
new Binding()
{
Mode = BindingMode.OneWay,
Source = ViewModel,
Path = new
PropertyPath("Item.Information"),
TargetNullValue = "No information found"
});
感谢@ grek40建议我在示例应用中重新创建问题。它澄清了错误的来源。
答案 2 :(得分:-3)
试试这样。我认为INotifyPropertyChanged接口的实现有问题。
CREATE TABLE