C# MVVM:当DataContext不为null时,使用DataTemplate将viewmodel(DataContext)绑定到视图

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。这

在主XAML中:

<DataTemplate DataType="{x:Type vm:GraphicEditorPropertyViewModel}">
    <views:GraphicEditorPropertyView/>
</DataTemplate>
}

构造函数中的DataContextnull

WindowPattern\u MouseClick函数中的DataContextNOTnull


为什么?

因为必须设置
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());
    }
}