MvvM с пользовательскими элементами просмотра.Проблемы с привязкой данных - PullRequest
1 голос
/ 03 февраля 2011

Как новичок в привязке данных, я не знаю, что я делаю неправильно.

  • У меня есть некоторые элементы GUI, определенные в XAML, и я связал их с даннымис соответствующими ViewModels.Пока все хорошо.

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

Итак, я сделал, чтобы зарегистрировать некоторые свойства DependencyProperties и установить привязки к одному из существующих ViewModels, так какмне показалось логичным.

Теперь свойства DependencyProperties этих пользовательских классов отображают странное поведение.

i) Когда я сохраняю фокус только на видах (элементах управления), которые используют ту же модель представления с пользовательскими элементами, свойства обновляются нормально.Если я щелкну где-нибудь еще, привязки прекратятся.

ii) Иногда Callback не вызывался, хотя свойство менялось.

iii) Когда StartupURI в App.xaml был MainWindowЕсли я объявил ProfileV как поле (независимо от того, где оно было создано), механизм привязки данных будет работать как (i).Если он был объявлен внутри конструктора, механизм не работал.

Что я делаю неправильно, и что я неправильно понимаю в привязке данных ??

class ProfileV : FrameworkElement, IGraphicalElement
{
  public int SelectedTab
  {
    get { return (int)GetValue(SelectedTabProperty); }
    set { SetValue(SelectedTabProperty, value); }
  }
  public static readonly DependencyProperty SelectedTabProperty =
   DependencyProperty.Register("SelectedTab", typeof(int), typeof(ProfileV),
   new PropertyMetadata(new PropertyChangedCallback(CallBack)));

  public ProfileV(GeneralExecutionVM VM,CanvasV canvasV)
  {
    DataContext = VM;
    BindingOperations.SetBinding(this, SelectedTabProperty, new Binding("SelectedTab"));
  }
  public static void CallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {

  }
}

Что связано с этим

public class GeneralExecutionVM : ObservableObject
{
  private int _SelectedTab;
  public int SelectedTab
  {
    get { return _SelectedTab; }
    set
    {
      if (_SelectedTab == value) return;
      _SelectedTab = value;
      base.RaisePropertyChanged("SelectedTab");
    }
  }
}

(Наблюдаемый объект, это базовый класс из Фонда MVVM Джоша Смита.)

ОТВЕТ
ОК, я нашел его.Это неправильное представление о DataContext .
Будьте осторожны, когда и где вы его устанавливаете, против установки явного исходного объекта .Я злоупотребил этим здесь и вызвал небольшую хаотическую ситуацию.

...