Порядок связывания WPF, как обеспечить привязку одного свойства к другому - PullRequest
10 голосов
/ 06 октября 2011
<Controls:MyControl Mode="Mode1" Value="{Binding Path=Something}" />

Проблема, с которой я столкнулся, заключается в том, что привязка происходит до установки свойства Mode, когда я использую этот элемент управления в шаблоне данных ListView.

Как мне убедиться, что режим всегда установлен перед привязкой значения?

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Пытались ли вы поднять событие изменения свойства для вашего свойства "Что-то", когда был установлен режим вашего управления?Вы можете получить свойство «Нечто» в вашем элементе управления следующим образом -

Binding binding = BindingOperations.GetBindingExpression(this, this.Value).ParentBindingBase;
String propertyToRefresh = binding.Path.Path;

(this.DataContext as ViewModel).OnPropertyChange(propertyToRefresh);

Я предполагаю, что DataContext вашего элемента управления является экземпляром вашего ViewModel, который реализует INotifyPropertyChangedInterface.

В случае, если ваша ViemodelМетод класса OnPropertyChange не является публичным, или у вас нет ссылки на ваш класс ViewModel в вашем элементе управления.Вы можете просто вызвать UpdateTarget () для вашего BindingExpression, как это (как предложено Томасом Левеском) -

BindingExpression binding = BindingOperations.GetBindingExpression(this, this.Value);
binding.UpdateTarget();
1 голос
/ 06 октября 2011

Что вы могли бы сделать, это отложить привязку, так что вы можете быть (почти) уверены, что значение режима установлено до тех пор.В .net 4.5 есть свойство привязки задержки.Вот статья о том, как смоделировать это свойство в .net 4.0 Задержка при привязке из .Net 4.5 в .Net 4.0

. Я лично реализовал бы это в viewModel (MVVM), где этопроблема довольно проста для решения.Сделайте два свойства Mode и Something.При изменении режима должно также появиться свойство «Something» (через интерфейс INotifyPropertyChanged).

class MyViewModel : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
      if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string _mode;

    public string Mode
    {
      get { return _mode; }
      set
      {
        _mode = value;
        OnPropertyChanged("Mode");

        // OnPropertyChanged("Something");
        // or build up via a method:
        // Something = DetermineFromMode(Mode);
      }
    }

    private string _something;

    public string Something
    {
      get { return _something;  }
      set
      {
        _something = value;
        OnPropertyChanged("Something");
      }
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...