【问题标题】:Add Property to an existing class in a library将属性添加到库中的现有类
【发布时间】:2017-06-14 07:45:42
【问题描述】:

我想向 Microsoft.Exchange.WebServices.Data.Folder 类添加一个属性。 这样做的原因是,我需要一个 bool 属性“Selected”将它在 WPF 中绑定到一个复选框。

首先我认为我可以使用 C#-Extensions,但目前无法编写属性扩展。

然后我创建了自己的类“MyFolder”,这样我就可以从 Folder 类转换为我的类。

它也不起作用。

public class MyFolder : Folder, INotifyPropertyChanged
{
    private bool selected;

    public bool Selected
    {
        get { return selected; }
        set { selected = value; OnPropertyChanged("Selected"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public MyFolder(ExchangeService service):base(service)
    {

    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

编辑:

我知道可以将属性文件夹添加到类 MyFolder。但我认为它必须以一种优雅的方式成为可能。

public class MyFolder : INotifyPropertyChanged
{
    private bool selected;

    public bool Selected
    {
        get { return selected; }
        set { selected = value; OnPropertyChanged("Selected"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public Folder FolderObject { get; set; }

    public MyFolder(Folder FolderObject)
    {
        this.FolderObject = FolderObject;
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

【问题讨论】:

  • 您在代码中使用的是Folder 还是MyFolder
  • MyFolder 是我要使用的类,因为 MyFolder 具有 selected 属性。
  • 我明白,但你说你必须将Folder 转换为MyFolder。这就是为什么我要问您是否在代码中使用FolderMyFolder
  • 我正在使用 MyFolder
  • 您应该将您尝试绑定到的类包装在视图模型中,然后您可以将选定的属性添加到视图模型类,请参阅msdn.microsoft.com/en-gb/library/hh848246.aspx

标签: c# wpf oop


【解决方案1】:

您不需要向现有类添加属性。 正如您在 MVVM 中一样,为什么不简单地实现一个表示该功能的视图模型。

例如:

class MyFolderViewModel : INotifyPropertyChanged
{
    public bool IsSelected { get; set; }

    private Folder folderObject;
}

【讨论】:

  • 谢谢!这是一个好方法,但我没有使用 MVVM。以后我会记住的!
  • 一般你使用MVVM。您的类MyFolder 充当视图模型,因为它实现了INotifyPropertyChanged。您想通过MyFolder 实现什么目标?
【解决方案2】:

我想向Microsoft.Exchange.WebServices.Data.Folder 类添加一个属性。

这确实是不可能的,因为你还没有自己定义这个类,因此你不能改变它的定义。向类添加属性需要重新编译它。

然后我创建了自己的类“MyFolder”,这样我就可以从 Folder 类转换为我的类。

您不能将 Microsoft.Exchange.WebServices.Data.Folder 对象转换为您的自定义类型...这永远不会起作用。

您应该做的是创建自己的类,例如MyFolder,它包装了您需要的 Microsoft.Exchange.WebServices.Data.Folder 类的任何功能。我猜这基本上就是你已经做过的事情了。没有更好的办法。

然后,您可以直接绑定到实现 INotifyPropertyChanged 接口的客户端感知类 (MyFolder) 的实例。这确实是一个很好的推荐方法。忘记向内置类添加属性和强制转换。

【讨论】:

  • 如何将现有的 Folder 对象转换为 MyFolder 对象?
  • 你不能转换它。您应该将其包装在您的自定义类中。然后您可以简单地绑定到 MyFolder 对象的 Folder.SomeProperty。
  • @Waterfront 您不能将 Folder 转换为 myFolder,但是您可以设置一个隐式或 Explixt 转换器,以便您进行转换,请参阅 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多