【问题标题】:Databinding setting to null and starting new数据绑定设置为 null 并开始新的
【发布时间】:2011-11-23 12:12:23
【问题描述】:

我的 App 类中有一个对象 Order,它们都实现了 INotfiyPropertyChanged。 订单结束后,我将其设置为 null 并执行 new Order() 以重新启动新订单。

问题是:似乎其 DataContext 绑定到 Order 的对象似乎总是链接到旧的 Order

如果我重新启动订单时不必再次手动重新绑定,我该怎么做? 对于具有此 DataContext 的每个对象,我需要执行 object.DataContext= App.Order。我该怎么做才能避免这种情况?

一些代码:

public partial class App : Application, INotifyPropertyChanged
{
    private Order m_order = new Order();

    public Order Order
    {
        get { return m_order; }
        set
        {
            m_order = value;
            NotifyPropertyChanged("Order");
        }
    }
    //...

    public bool getOrderClosed()
    {
        if (Order != null)
        {
             Order = null;
        }

        return (Order == null);
    }

    public bool getOrderOpened()
    {
        if (Order == null)
            Order = new Order();

        return (Order != null);
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

 //code on the part where the order is finished

    private void Confirm_Click(object sender, RoutedEventArgs e)
    {
        //...
        if (SaveOrder())
        {
            theApp.getOrderClosed();
            theApp.getOrderOpened();
            theApp.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.Basket.DataContext = theApp.Order;
        }

    }

【问题讨论】:

  • 向我们展示您的确切代码。包含属性实现、设置为 null 和似乎没有更新的绑定。
  • 这一行现在正在解决问题。 theApp.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.Basket.DataContext = theApp.Order;

标签: wpf data-binding null new-operator datacontext


【解决方案1】:

如果我理解正确,您的 Order 对象 DataContext。如果您在代码隐藏中设置 DataContext,它看起来像:

[some_element].DataContext = myApp.Order;

您需要做的是绑定 DataContext 到 myApp.Order。这样,当你做类似的事情时

myApp.Order = new Order(...);

[some_element] 的 DataContext 也会发生变化。如果您在使用 Order 对象作为 DataContext 的位置发布 XAML 代码,我可以准确地向您展示您在 DataContext 上的绑定应该是什么样子。

根据您所做的,只有在 DataContext 中的更改会被拾取;当您在 DataContext 更改时更改您正在使用的 属性 时,DataContext 本身不会。

【讨论】:

  • 例如:在代码中我在 UserControl 中做了一些事情,比如: theUserControl.DataContext = theApp.Order; UserControl 封装了以下字段: 其中 FirstPhone 是通知自身更改的 Order 属性
  • 您是否将数据绑定设置为 null,然后每次创建新订单时设置为较新的对象?
  • Kshitij Mehta:设置绑定,是 FirstPhone UI 元素的绑定吗?不,我没有设置。不是 XAML 绑定概念的想法是您不必触摸绑定并且数据本身会通知它们对关联绑定的更改吗?
【解决方案2】:

几周前我遇到了类似的问题。我发现在将绑定属性分配给新对象时,绑定丢失了,因此作为一种解决方法,我必须创建一个新的临时对象,然后将所有字段复制到我的绑定属性中,这样您就可以有效地拥有一个新对象和保持绑定。

希望这会有所帮助!

【讨论】:

  • 可能我必须实现一个 Init() 函数,该函数重新初始化 Order 类中的所有内容。相反,我可以在构造函数中重用这个函数,而不是初始化类成员声明中的所有内容。
【解决方案3】:

也许将绑定更改为UpdateSourceTrigger=PropertyChanged

【讨论】:

  • 这只影响方向 target->source 这不是这里的问题。
  • 在我看来:这里的问题不是对象内部的更改,而是新对象的创建,即在内存中的另一个位置,绑定对象的 DataContext 属性不是能够适应这种情况。
【解决方案4】:

如果 App 正确实现 INotifyPropertyChanged,它会在您将 App.Order 设置为新实例时触发,并且绑定会更新。

您确定它已正确实施吗? 例如。

class App
{
    public Order Order
    {
        get 
        {
            return _order;
        }
        set
        { 
            if (value != _order)
            {
                 _order = value;
                 FirePropertyChanged("Order");
            }
        }
    }
}

【讨论】:

  • 这应该是正确的实现还是不正确的示例?我希望是后者。
  • 正如您在我的代码中看到的那样,这与您的代码相似 - 唯一的区别是条件 if (value != _order) - 这不会解决任何问题。如果是我的,显然,它不适用于你的。
  • 您的未更新对象是如何绑定的?它们是“App.Order.SomeProperty”还是其他方法。我们需要查看 XAML
  • 如果我观察 DataContext,我看到的是旧订单的数据,所以,这无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多