Wpf 用户控制';s DataContext:直接设置为viewmodel
我有一个wpf用户控件和一个相应的viewmodel(ChamberVm) 在viewmodel中有一个名为“UnitStatus”的属性 但我得到了绑定错误: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
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>