数据绑定设置为null并启动新的

时间:2011-11-23 12:12:23

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

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

问题是:似乎DataContext绑定到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;
        }

    }

4 个答案:

答案 0 :(得分:2)

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

[some_element].DataContext = myApp.Order;

您需要做的是绑定 DataContext到myApp.Order。这样,当您执行类似

的操作时
myApp.Order = new Order(...);

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

使用您已完成的操作,只会拾取 DataContext中的更改;当您在DataContext更改时更改您正在使用的属性时,DataContext本身不会。

答案 1 :(得分:1)

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

希望这有帮助!

答案 2 :(得分:0)

可能会将绑定更改为UpdateSourceTrigger=PropertyChanged

答案 3 :(得分:0)

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

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

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