目前我遇到的问题是,我的业务对象覆盖 ToString
以将数据传送到某些 telerik 控件 (RadListBox
/RadListBoxItem
)。覆盖 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
嵌入到另一个 View 模型中。它绑定(bind)到 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}" />
非常感谢!
最佳答案
Is it possible in c# to raise the method ToString to be changed?
不,这是不可能的。您不能强制其他代码再次调用 ToString()
作为其他事件的直接结果。就此而言,INotifyPropertyChanged
起作用的唯一原因是,按照惯例,代码知道在引发事件时订阅该事件并调用属性 getter(这是一种方法)。该事件实际上并不强制任何代码调用属性 getter ;只是任何愿意订阅该事件的人几乎肯定会在事件引发时调用该方法。
当然,您始终可以在您想要的许可代码段之间设置任何机制。但是对于本身没有理由相信它可能会根据调用时间从 ToString()
得到不同结果的代码,这样的机制将不存在。
For example if Name is chagned, ToString should be called to get the new value.
您始终可以自己订阅 INotifyPropertyChanged.PropertyChanged
,然后执行某些操作以强制再次调用 ToString()
方法。从您提供的小代码中不清楚如何完成此操作;可能将 SelectedItem
设置为 null
然后返回到所需的对象。
综上所述,虽然我不熟悉您正在使用的控件 (RadPropertyGrid
),但假设它遵循普通 WPF 模型,那么如果它实际上显示的是 SelectedItem
object 以某种方式,我猜它这样做的方式与对该类型使用 DataTemplate
兼容。 IE。如果您要为 ViewModel
类声明一个 DataTemplate
,您可以直接绑定(bind)到 Name
属性。例如:
<DataTemplate DataType="l:ViewModel">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
...WPF 会在名称更改时自动更新显示的名称。
您的 ToString()
方法提供了默认名称值 "--"
。如果需要,这可以合并到 Name
属性本身,或者您可以添加一个新属性,例如DisplayName
提供该功能(即,如果由于某种原因您需要 Name
在未设置属性时保持 null
)。
没有a good, minimal, complete code example清楚地表明你在做什么,不可能确定最好的方法是什么。但是,好的 WPF 库不支持正常的绑定(bind)和模板机制,而是完全依赖 ToString()
重写而没有任何值更新机制,这将是令人惊讶的通知。
关于c# - WPF - ToString 的 Raise 属性已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777459/