C# MVVM:当DataContext不为null时,使用DataTemplate将viewmodel(DataContext)绑定到视图
在主XAML中:C# MVVM:当DataContext不为null时,使用DataTemplate将viewmodel(DataContext)绑定到视图,c#,wpf,mvvm,C#,Wpf,Mvvm,在主XAML中: <DataTemplate DataType="{x:Type vm:GraphicEditorPropertyViewModel}"> <views:GraphicEditorPropertyView/> </DataTemplate> } 构造函数中的DataContext为null WindowPattern\u MouseClick函数中的DataContext为NOTnull 为什么?因为必须设置DataContext。这
<DataTemplate DataType="{x:Type vm:GraphicEditorPropertyViewModel}">
<views:GraphicEditorPropertyView/>
</DataTemplate>
}
构造函数中的DataContext为null
WindowPattern\u MouseClick函数中的DataContext为NOTnull
为什么?因为必须设置
DataContext
。这只是正常的财产
想想你将如何在对象上设置DataContext
。首先创建对象(从而运行整个构造函数),然后设置DataContext
属性
这就是系统在后台所做的。DataTemplate为我设置DataContext。每当我附加视图模型时,如。视图将自动创建。DataContext将被设置为视图模型。问题是函数WindowPattern\u MouseClick中的DataContext可用。您应该使用转换器来实现这一点,而不是代码隐藏。如果没有其他原因,您就不必担心在构建视图之前没有设置DataContext,而实际上它没有。要执行所需操作,您需要覆盖DataContextProperty的元数据以添加属性更改的观察程序,或者需要卸载此DataContext篡改,直到通过Dispatcher.BeginInvoke加载应用程序。但IValueConverter是最简单的方法。
public partial class GraphicEditorPropertyView : UserControl
{
private bool SecurityLevelBar_MouseCaptured = false;
public GraphicEditorPropertyView()
{
InitializeComponent();
Int32 pattern = ((GraphicEditorPropertyViewModel)(this.DataContext)).CurrentGraphicEditorVgProperty.Pattern;
UInt32 frontColor = ((GraphicEditorPropertyViewModel)(this.DataContext)).CurrentGraphicEditorVgProperty.FrontColor;
UInt32 backColor = ((GraphicEditorPropertyViewModel)(this.DataContext)).CurrentGraphicEditorVgProperty.BackColor;
ConvertPattern2BrushCanvas convertPattern2BrushCanvas = new ConvertPattern2BrushCanvas(((GraphicEditorPropertyViewModel)(this.DataContext)).Parent.CurrentLibDiagramDesigner);
Brush brush = convertPattern2BrushCanvas.Convert(new object[] { frontColor, backColor, pattern }, null, null, null) as Brush;
Selected_Pattern.Fill = brush;
}
private void WindowPattern_MouseClick(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
Brush buttonBrush = button.Background;
Selected_Pattern.Fill = buttonBrush;
((GraphicEditorPropertyViewModel)(this.DataContext)).CurrentGraphicEditorVgProperty.Pattern = System.Convert.ToInt32(button.ToolTip.ToString());
}
}