WPF DataContext PropertyChanged 为空

问题描述 投票:0回答:1

我有两个 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
未正确初始化,但我无法解决此问题。

感谢任何正确方向的帮助或指导。

c# wpf data-binding inotifypropertychanged datacontext
1个回答
0
投票

SingleStepView
控件不得具有“私有”视图模型。

如果从

Grid
中删除 DataContext 分配,则 Label 的 DataContext 将自动从 UserControl 继承,并且这将采用在“包含视图的组件”的 XAML 中分配的对象。

<UserControl c:Class="MyNameSpace.Views.SubView.SingleStepView" ...>
    <Grid x:Name="SingleStepGrid">
        <Label Content="{Binding StepName}" .../>
    </Grid>
</UserControl>
© www.soinside.com 2019 - 2024. All rights reserved.