c# - WPF - ToString 的 Raise 属性已更改

标签 c# wpf xaml tostring telerik-grid

目前我遇到的问题是,我的业务对象覆盖 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/

相关文章:

c# - .NET - 从代码设置电源选项

c# - 在 DataGrid、Silverlight 导航应用程序中选择整行

c# - 在代码中引用 XAML 元素时出现 WPF NullReferenceException

c# - 在 UWP 中将图钉添加到 MapControl

c# - 在 Windows Phone 应用程序中格式化 MVVM 中的数据

c# - 在我的 asp.net 中使用 ajax 更新 datagridview 而无需刷新页面。(显示实时数据)

c# - 强制应用程序连续运行的保证方式(覆盖 taskkill、任务管理器等)

c# - 从后面的代码添加组合框项目。 [WPF]

c# - 在 C#/WPF 中从线程显示 MessageBox,就像它来自主线程一样

wpf - .net 4 框架中的 WPF4 中的 EventToCommand 未附带 LightMvvm