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}" />
谢谢!
是否可以在 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()
重写,这将是令人惊讶的。