具有自定义View-Elements的MvvM。数据绑定问题

时间:2011-02-03 13:20:37

标签: wpf data-binding mvvm

作为数据绑定的新手,我不知道我做错了什么。

  • 我在XAML中定义了一些GUI元素,并且我使用适当的ViewModel对它们进行了数据绑定。到目前为止一切顺利。

  • 我还有一些自定义元素(几何形状)放置在Canvas中(Canvas我通过用户控件放置在主窗口内)。我从FrameworkElement派生了这些实体,以支持数据绑定。

所以我所做的就是注册一些DependencyProperties并将绑定设置为现有的ViewModel之一,因为在我看来这是合乎逻辑的。

现在这些自定义类的DependencyProperties显示一些奇怪的行为。

i)当我只关注使用相同ViewModel和自定义元素的Views(控件)时,属性会正常更新。如果我点击其他地方,绑定就会中断。

ii)有时,虽然该属性正在改变,但未调用回调。

iii)当App.xaml中的StartupURI是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");
    }
  }
}

(Observable Object,是MVVM Foundation的基类,Josh Smith。)

ANSWERED
好的我找到了。这里的误解是关于 DataContext 在设置它时,请注意设置显式源对象。我在这里误用了它,造成了一个小小的混乱局面。

0 个答案:

没有答案