首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性更改不会传播到绑定目标(UWP)

属性更改不会传播到绑定目标(UWP)
EN

Stack Overflow用户
提问于 2018-09-13 16:20:15
回答 1查看 171关注 0票数 0

我有一个ViewModel和一个类。它们看起来像这样:

代码语言:javascript
复制
//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的值,如下所示:

代码语言:javascript
复制
  <TextBlock Text="{x:Bind  Path=MyViewModel.MyClass.MyString, Mode=TwoWay}"></TextBlock>

然而,这并不起作用。值在初始化时被正确绑定,但MyViewModel.MyClass.MyString中的任何更改都不会反映在文本块中,文本保持不变。引发OnPropertyChange,命中ViewModelBase中的断点并更改MyString值,但不会以某种方式将其传播到texblock。绑定来自MyClass的简单值就像charm一样,当属性改变时,这个文本块就会更新:

代码语言:javascript
复制
  <TextBlock Text="{x:Bind  Path=MyViewModel.TestString, Mode=TwoWay}"></TextBlock>

我遗漏了什么?为什么绑定到"MyViewModel.MyClass.MyString“的文本块没有被更新?

EN

回答 1

Stack Overflow用户

发布于 2018-09-13 18:00:14

我已经测试了你提供的代码,我不认为它有任何问题。然而,问题可能出在页面的代码隐藏上。有没有可能,你不是在用它作为属性声明吗?

代码语言:javascript
复制
public MyViewModel MyViewModel => new MyViewModel();

因为在这种情况下,对MyViewModel属性的每次访问都被视为MyViewModel类的一个新实例。在此配置中,您可以正确地更改属性,但UI永远不会注意到,因为您将在新实例上更新该属性。如果您改为使用

代码语言:javascript
复制
public MyViewModel MyViewModel { get; } = new MyViewModel();

在创建页面时,您将获得仅创建一个实例的正确行为。

我有以下代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52309467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档