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' 实例是最令人印象深刻的位置。
如果您有任何其他问题,请随时告诉我。
我有一个 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' 实例是最令人印象深刻的位置。
如果您有任何其他问题,请随时告诉我。