作为数据绑定的新手,我不知道我做错了什么。
我在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
在设置它时,请注意设置显式源对象。我在这里误用了它,造成了一个小小的混乱局面。