我有一个ViewModel和一个类。它们看起来像这样:
//viewmodel
public class MyViewModel : ViewModelBase {
private MyClass myClass;
public MyClass MyClass{
get{
return myClass;
}
set{
this.myClass = value;
base.OnPropertyChanged();
}
}
private string testString;
public string TestString{
get{
return testString;
}
set{
this.testString = value;
base.OnPropertyChanged();
}
}
public MyViewModel(){
this.MyClass = new MyClass();
this.TestString = "blah, blah, blah"
}}
//class
public class MyClass : ViewModelBase{
private string myString;
public string MyString{
get {
return myString
}
set{
this.myString = value;
base.OnPropertyChanged();
}
}
public MyClass (){
this.MyString = "25"; }}基类- ViewModelBase实现INotifyChange并包含OnPropertyChanged处理程序逻辑。我有一个UserControl,我希望在其中绑定来自MyClass的值,如下所示:
<TextBlock Text="{x:Bind Path=MyViewModel.MyClass.MyString, Mode=TwoWay}"></TextBlock>然而,这并不起作用。值在初始化时被正确绑定,但MyViewModel.MyClass.MyString中的任何更改都不会反映在文本块中,文本保持不变。引发OnPropertyChange,命中ViewModelBase中的断点并更改MyString值,但不会以某种方式将其传播到texblock。绑定来自MyClass的简单值就像charm一样,当属性改变时,这个文本块就会更新:
<TextBlock Text="{x:Bind Path=MyViewModel.TestString, Mode=TwoWay}"></TextBlock>我遗漏了什么?为什么绑定到"MyViewModel.MyClass.MyString“的文本块没有被更新?
发布于 2018-09-13 18:00:14
我已经测试了你提供的代码,我不认为它有任何问题。然而,问题可能出在页面的代码隐藏上。有没有可能,你不是在用它作为属性声明吗?
public MyViewModel MyViewModel => new MyViewModel();因为在这种情况下,对MyViewModel属性的每次访问都被视为MyViewModel类的一个新实例。在此配置中,您可以正确地更改属性,但UI永远不会注意到,因为您将在新实例上更新该属性。如果您改为使用
public MyViewModel MyViewModel { get; } = new MyViewModel();在创建页面时,您将获得仅创建一个实例的正确行为。
我有以下代码:
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
public MyViewModel MyViewModel { get; } = new MyViewModel();
private void Button_Click(object sender, RoutedEventArgs e)
{
MyViewModel.MyClass.MyString = "test";
}
}和我的简单ViewModelBase
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}https://stackoverflow.com/questions/52309467
复制相似问题