UserControl的DataContext:直接设置为viewmodel

UserControl's DataContext: set it to viewmodel directly

我有一个 wpf 用户控件和一个相应的视图模型 (ChamberVm)。

在视图模型中有一个名为 'UnitStatus' 的 属性 但是我遇到了绑定错误:

System.Windows.Data Error: 40 : BindingExpression path error: 'UnitStatus' property not found on 'object' ''String' (HashCode=-1814504727)'. BindingExpression:Path=UnitStatus; DataItem='String' (HashCode=-1814504727); target element is 'VacGram' (Name='sysdgm'); target property is 'UnitStatus' (type 'KeyValuePair`2')

我注意到错误可能与我控件的 header 部分中的 DataContext 设置有关:

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:dgm="clr-namespace:VacSym;assembly=VacSymDgm"             
             xmlns:v="clr-namespace:VacViews"    
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="400"
             DataContext="ChamberVm">
    <Grid Name="gridMain">
        <Grid.RowDefinitions>
            <RowDefinition Height="0*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="15"></RowDefinition>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="1">
            <DockPanel x:Name="pnlDgm" Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <dgm:VacGram x:Name="sysdgm" UnitStatus="{Binding UnitStatus}" DiagramFile="{Binding DiagramFile}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
            </DockPanel>

       . . .

我想知道:

1、为什么这个不正确(?)

    DataContext="ChamberVm"

2、报错信息中的'String'是什么意思:

    ...not found on 'object' ''String'

作业

DataContext="ChamberVm"

将字符串 "ChamberVm" 分配给 DataContext 属性。

为了分配 ChamberVm 的实例 class,您必须编写以下内容,并使用适当的命名空间前缀:

<UserControl ...>
    <UserControl.DataContext>
        <v:ChamberVm/>
    </UserControl.DataContext>
    ...
</UserControl>

一般来说,您应该完全避免显式分配 DataContext 属性。

您可以将 UserControl 放在一个 DataTemplate 中,该模板应用于例如将 ChamberVm 对象分配给其 Content 属性 的 ContentControl。然后将自动设置 UserControl 的 DataContext。

您的 DataContext 是字符串 "ChamberVm",不是对象。

这就是为什么你找不到 UnitStatus

<!-- Just set string in DataContext -->
<Window DataContext="ChamberVm">

</Window>

ChamberVm string 正确。
所以,DataContext(string)中当然没有UnitStatus(object)了。

并且 DataContext 属性 是 object 类型。

// DependencyProperty
public object DataContext { get; set; }

// You can put anything in.

这是每个人都经常犯的错误。

无论如何,您主要通过两种方式使用 DataContext。

(随你喜欢)

1。 XAML.

中的 DataContext 直接绑定
<Window xmlns:vm="clr-namespace:VacViews.ViewModels">
    <Window.DataContext>
        <vm:ChamberVm/>
    </Window.DataContext>
</Window>

您必须首先在顶部声明您的视图模型的命名空间。 xmlns:vm="your namespace"

并打开 DataContext 以声明您创建的视图模型。这是创建一个实例并将其分配给DataContext。

2。后面设置Create Instance.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // Your ViewModel set in DataContext.
        DataContext = new ChamberVm();
    }
}

在构造函数块中创建一个 'view model' 实例是最令人印象深刻的位置。

如果您有任何其他问题,请随时告诉我。