Wpf 用户控制';s DataContext:直接设置为viewmodel

Wpf 用户控制';s DataContext:直接设置为viewmodel,wpf,data-binding,wpf-controls,Wpf,Data Binding,Wpf Controls,我有一个wpf用户控件和一个相应的viewmodel(ChamberVm) 在viewmodel中有一个名为“UnitStatus”的属性 但我得到了绑定错误: System.Windows.Data Error: 40 : BindingExpression path error: 'UnitStatus' property not found on 'object' ''String' (HashCode=-1814504727)'. BindingExpression:Path=UnitS

我有一个wpf用户控件和一个相应的viewmodel(ChamberVm)

在viewmodel中有一个名为“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')
我注意到错误可能与控件标题部分中的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>

       . . .
2、“字符串”在错误消息中的含义:

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

作业

DataContext="ChamberVm"
将字符串
“ChamberVm”
分配给DataContext属性

为了分配ChamberVm类的实例,您必须使用适当的名称空间前缀编写以下代码:

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

...

通常,应该避免显式分配DataContext属性,因为这样做会破坏控件属性的标准DataContext绑定


控件应从其父元素(例如窗口或页面)继承DataContext值。

您的DataContext是字符串
“ChamberVm”
,而不是对象

这就是为什么您找不到
UnitStatus


ChamberVm是
字符串
右侧。
当然,DataContext(字符串)中没有UnitStatus(对象)

DataContext属性是
对象
类型

//DependencyProperty
公共对象DataContext{get;set;}
//你可以放任何东西进去。
这是每个人都经常犯的错误

无论如何,使用DataContext有两种主要方式。 (你喜欢)

1.XAML中的DataContext直接绑定。

必须首先在顶部声明视图模型的命名空间
xmlns:vm=“您的命名空间”

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

2.在后面设置创建实例。
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
//在DataContext中设置ViewModel。
DataContext=new ChamberVm();
}
}
在构造函数块中创建“视图模型”实例是最令人印象深刻的位置

如果您还有任何问题,请随时告诉我

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