首页 > 解决方案 > 额外属性不刷新

问题描述

我制作了一个自定义按钮,因为我希望能够独立地为内容设置不同的字符串。然后ControlTemplate,我在我的 xaml 中创建了一个,以指定应如何呈现这两个内容。内容绑定到选定项目的子属性(来自列表视图)。如果选择发生更改,我将使用INotifyPropertyChanged它来通知视图。然后我的按钮的内容和子内容,应该相应地改变。

现在这适用于内容。但子内容仅在程序首次加载时显示任何内容。在第一次更改选择后,它变为空白,并保持空白。

我错过了什么吗?我还有什么需要补充的吗?

自定义按钮 C#

public class DoubleContentButton : Button
{
    static  DoubleContentButton() { }

    public object SubContent
    {
        get => GetValue(SubContentProperty);
        set => SetValue(SubContentProperty, value);
    }

    public  static readonly DependencyProperty SubContentProperty =
        DependencyProperty.Register(name: "SubContent", typeof(object), typeof(DoubleContentButton), new UIPropertyMetadata());
}

自定义按钮控件模板

<Style x:Key="StatusButton" TargetType="{x:Type custom:DoubleContentButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type custom:DoubleContentButton}">
                <StackPanel Margin="0 0 0 20">

                    <!-- This updates -->
                    <TextBlock Text="{TemplateBinding Content}"/>

                    <!--  This does not update -->
                    <TextBlock Text="{TemplateBinding SubContent}" />

                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

按钮的实现

<custom:DoubleContentButton
    Command="{Binding MyCommand}"
    Content="{Binding SelectedItem.Status}"
    SubContent="{Binding SelectedItem.SubStatus}"
    Style="{StaticResource StatusButton}" />

标签: c#wpfcustom-controlsinotifypropertychanged

解决方案


您能否检查您的 SubStatus 属性是否在“SubStatus”的设置器上引发了 PropertyChangedEventHandler,或者如果有,是否正确引发?

像这样:

public event PropertyChangedEventHandler PropertyChanged;  

private void OnPropertyRaised(string propertyname)
{  
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));  
} 

public string SubStatus
{
    get { ... }
    set
    {  
        _SubStatus = value;  
        OnPropertyRaised(nameof(SubStatus));
    }  
}

推荐阅读