我有两个 WPF 组件,一个包含另一个的列表。 我在父 WPF 组件中设置了 DataContext,因此我可以定义一个属性。 不幸的是,我的模型的
PropertyChanged
始终为空,因此我的标签(计算属性)未更新。
包含视图的组件:
<Grid x:Name="ValidationGrid" Background="White">
<subView:SingleStepView x:Name="Step01" Grid.Column="0" Grid.Row="0" >
<subView:SingleStepView.DataContext>
<subView:SingleStepModel CurrentStep="Step1"/>
</subView:SingleStepView.DataContext>
</subView:SingleStepView>
<subView:SingleStepView x:Name="Step02" Grid.Column="1" Grid.Row="0" >
<subView:SingleStepView.DataContext>
<subView:SingleStepModel CurrentStep="Step2"/>
</subView:SingleStepView.DataContext>
</subView:SingleStepView>
</Grid>
带有标签的视图:
<UserControl x:Name="SingleStep" x:Class="MyNameSpace.Views.SubView.SingleStepView"
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:local="clr-namespace:MyNameSpace.Views.SubView"
mc:Ignorable="d"
d:DesignHeight="70" d:DesignWidth="146" MouseDoubleClick="SingleStep_MouseDoubleClick">
<UserControl.Resources>
<local:SingleStepModel x:Key="SingleStepModel" />
</UserControl.Resources>
<Grid x:Name="SingleStepGrid" DataContext="{StaticResource SingleStepModel}">
<Label x:Name="LblStepName" Content="{Binding StepName, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1" Grid.Column="0"/>
</Grid>
</UserControl>
型号代码:
public partial class SingleStepModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyRaised(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
public String StepName
{
get
{
return IrrelevantLogic();
}
}
}
在此模型中的另一个属性上,我称之为:
OnPropertyRaised(nameof(StepName));
通过使用调试器,我可以看到
PropertyChanged
始终为 null,因此不会被调用。因此,我的标签没有改变,即使我可以看到 StepName
将包含一个新值。
我怀疑,因为我在
ValidationGrid
中分配了 DataContext,所以 INotifyPropertyChanged
未正确初始化,但我无法解决此问题。
感谢任何正确方向的帮助或指导。
SingleStepView
控件不得具有“私有”视图模型。
如果从
Grid
中删除 DataContext 分配,则 Label 的 DataContext 将自动从 UserControl 继承,并且这将采用在“包含视图的组件”的 XAML 中分配的对象。
<UserControl c:Class="MyNameSpace.Views.SubView.SingleStepView" ...>
<Grid x:Name="SingleStepGrid">
<Label Content="{Binding StepName}" .../>
</Grid>
</UserControl>