WPF - 针对 ToString 的引发属性已更改

本文关键字:属性 针对 ToString WPF | 更新日期: 2023-09-27 18:22:25

目前我遇到了一个问题,我的业务对象覆盖了将数据传送到某些 telerik 控件(RadListBox/RadListBoxItem(的ToString。重写ToString实现的模型INotifyPropertyChanged.是否可以在 c# 中提出要更改ToString的方法?初始值显示良好,但以后的更改将被忽略。例如:

public class ViewModel : UI.MVC.ViewModelBase
{
    private string name;
    [JsonProperty]
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            RaisePropertyChanged("Name");
        }
    }
    public override string ToString()
    {
        return name ?? "--";
    }
}

例如,如果Name被破坏,则应调用ToString以获取新值。

编辑

上面的ViewModel嵌入到另一个视图模型中。 绑定到RadPropertyGrid

public class FirstViewModel :  : UI.MVC.ViewModelBase
{
    public FirstViewModel()
    {
        SelectedItem = new ViewModel();
    }
    public object SelectedItem
    {
        get;
    }
}

RistViewModel 的一个实例是包含窗口的数据上下文。

XAML

<telerik:RadPropertyGrid NestedPropertiesVisibility="Visible" 
    x:Name="propertyGrid" Grid.Column="1" Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsGrouped="True" 
    Item="{Binding SelectedItem,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />

谢谢!

WPF - 针对 ToString 的引发属性已更改

是否可以在 c# 中引发要更改的方法 ToString?

不,这是不可能的。不能强制其他代码再次调用ToString()作为某些其他事件的直接结果。就此而言,INotifyPropertyChanged工作的唯一原因是,按照惯例,代码知道在引发事件时订阅该事件并调用属性 getter(这是一种方法(。该事件实际上并不强制任何代码调用属性 getter;只是任何费心订阅该事件的人几乎肯定会在引发事件时调用该方法。

当然,您始终可以在同意的代码段之间设置任何机制。但是对于本身没有理由相信它可能会根据调用时间从ToString()获得不同结果的代码,这种机制将不存在。

例如,如果 Name 被查格,则应调用 ToString 以获取新值。

您始终可以自己订阅INotifyPropertyChanged.PropertyChanged,然后执行某些操作来强制再次调用ToString()方法。从您提供的小代码中不清楚如何做到这一点;也许将SelectedItem设置为null,然后返回到所需的对象。


综上所述,虽然我不熟悉您使用的控件(RadPropertyGrid(,假设它遵循正常的 WPF 模型,那么如果它实际上以某种方式显示SelectedItem对象,我猜它这样做的方式与使用该类型的DataTemplate兼容。也就是说,如果要为 ViewModel 类声明一个DataTemplate,则可以直接绑定到 Name 属性。例如:

<DataTemplate DataType="l:ViewModel">
    <TextBlock Text="{Binding Name}"/>
</DataTemplate>

...并且 WPF 将在显示的名称发生更改时自动更新它。

ToString()方法提供默认名称值 "--" 。如果需要,这可以合并到Name属性本身中,或者您可以添加新属性,例如 DisplayName提供这一点(即,如果由于某种原因您需要Name在未设置属性时保持null(。

如果没有一个好的、最小的完整的代码示例来清楚地显示你正在做什么,就不可能确定什么是最好的方法。但是,对于一个好的 WPF 库来说,不支持正常的绑定和模板机制,而是完全依赖于没有任何值更新通知机制的ToString()重写,这将是令人惊讶的。