【问题标题】:How do I correctly bind?如何正确绑定?
【发布时间】:2011-12-29 13:09:59
【问题描述】:

我有一个 MyClass 类,它实现了 INotifyPropertyChanged,它有一些属性必须绑定在某个页面中。在我的页面中,我有

private MyClass myclass; 

在页面构造函数中我写了

ContentPanel.DataContext = myclass;   

当我将 myclass 分配给某个 MyClass 对象(我从某个回调中获得)时,页面中没有显示任何内容。

但是当我在 page.cs 中编写我必须更改的属性而不是 MyClass 类并绑定它们时,它可以正常工作。 或者当我给

ContentPanel.DataContext = this;

我在 xaml 中写

{binding this.myclass.property} 

它也可以正常工作。

这里是回调

 public void GetCommonInfoCallback(UserCommonInfo userCommonInfo)
    {
        CommonInfo = userCommonInfo;
    }

其中 UserCommonInfo 是 MyClass,CommonInfo 是 myclass。

 private UserCommonInfo userCommonInfo ;
    public UserCommonInfo CommonInfo
    {
        get
        {
            return userCommonInfo;
        }
        set
        {
            if (userCommonInfo != value)
            {
                userCommonInfo = value;
                OnPropertyChanged("CommonInfo");
            }
        }
    }

我不明白我的错误在哪里。你能帮帮我吗?

【问题讨论】:

  • 我们需要查看更多失败的代码。发布重现。
  • 这是 MyClass 属性衍生字符串用户名的示例;公共字符串用户名 { 获取 { 返回用户名; } set { if (username != value) { username = value; OnPropertyChanged("用户名"); } } }
  • @ctacke 请看我编辑了我的问题。我尝试了不同的方法,这里有一个。

标签: windows-phone-7 binding datacontext inotifypropertychanged


【解决方案1】:

当您设置 DataContext 时,它是用于数据绑定的 MyClass 的特定实例。所以执行后

ContentPanel.DataContext = myclass;

你可以稍后执行

myclass.someProperty = "new value of someProperty";

并且数据将在绑定控件中更新(假设这不是 OneTime 绑定,而是 OneWay 或 TwoWay 绑定)。

如果我正确理解您的问题,您想更改绑定以使用不同的 MyClass 实例。

myclass = new MyClass { /* ... */ }; // new instance of MyClass

此时,控件仍绑定到 MyClass 的前一个实例。您可以通过更新 DataContext 来改变它:

DataContext = myclass; // set context to the new MyClass instance

你写的第二种方法,用

ContentPanel.DataContext = this;

代表了一种不同的风格,你让页面类也作为数据绑定的数据模型实例。

在这种情况下,您不会更改数据绑定以使用数据模型的新实例(页面实例“this”没有更改)。恕我直言,将页面和数据模型分开是非常有价值的,所以我宁愿不使用 DataContext = 这种方法。

【讨论】:

  • 好的,感谢您的回答。所以你建议每次都改变 Datacontext。
  • public void GetCommonInfoCallback(UserCommonInfo userCommonInfo) { CommonInfo = userCommonInfo;数据上下文 = CommonInfo }
  • 如果回调返回一个新的 MyClass 实例,那么将 DataContext 设置为新实例是可行的方法。如果您回调返回了一些可以在当前绑定实例中设置的单个值(myclass.someProperty = ... 示例),那么只需在现有数据模型(myclass)上直接设置这些属性,然后不设置 DataContext,因为它已设置为正确的实例。
猜你喜欢
  • 2020-07-03
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多