Установка привязки данных к нулю и запуск нового - PullRequest
1 голос
/ 23 ноября 2011

У меня в классе App есть объект Order, который реализует INotfiyPropertyChanged.Когда ордер завершен, я устанавливаю его в null и создаю новый Order () для перезапуска нового ордера.

Проблема в том, что кажется, что объекты, для которых 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 ]

2 голосов
/ 24 ноября 2011

Если я правильно понимаю, ваш объект Order равен DataContext. Если вы устанавливаете DataContext в codebehind, он будет выглядеть примерно так:

[some_element].DataContext = myApp.Order;

Что вам нужно сделать, это привязать DataContext к myApp.Order. Таким образом, когда вы делаете что-то вроде

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

DataContext для [some_element] также изменится. Если вы разместите свой код XAML, где вы используете объект Order в качестве DataContext, я могу точно показать, как должна выглядеть ваша привязка к DataContext.

С тем, что вы сделали, будут восприняты только изменения в DataContext; при изменении свойства , которое вы используете при изменении DataContext, сам DataContext не изменяется.

1 голос
/ 24 ноября 2011

У меня была похожая проблема несколько недель назад. Я обнаружил, что при назначении привязанного свойства новому объекту привязка была потеряна, поэтому в качестве обходного пути мне пришлось создать новый временный объект, а затем скопировать все поля в мое привязанное свойство, чтобы вы эффективно получили свежий объект привязка сохраняется.

Надеюсь, это поможет!

0 голосов
/ 23 ноября 2011

Если приложение правильно реализует INotifyPropertyChanged, оно сработает, когда вы установите App.Order на новый экземпляр, и привязка обновится.

Вы уверены, что оно реализовано правильно?например.

class App
{
    public Order Order
    {
        get 
        {
            return _order;
        }
        set
        { 
            if (value != _order)
            {
                 _order = value;
                 FirePropertyChanged("Order");
            }
        }
    }
}
0 голосов
/ 23 ноября 2011

Может изменить привязку на UpdateSourceTrigger=PropertyChanged?

...