Как новичок в привязке данных, я не знаю, что я делаю неправильно.
У меня есть некоторые элементы 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 .
Будьте осторожны, когда и где вы его устанавливаете, против установки явного исходного объекта .Я злоупотребил этим здесь и вызвал небольшую хаотическую ситуацию.