我如何隐藏setter从XAML

本文关键字:setter XAML 隐藏 何隐藏 | 更新日期: 2023-09-27 18:04:48

我有一个不能设置属性的接口:

public interface IThing
{
    string MyText { get; }
}

我有一个允许设置属性的实现:

public class Thing : ObservableObject, IThing
{
    private string myText = "Testing 1 2 3";
    public string MyText
    {
        get { return this.myText; }
        set
        {
            if (this.myText != value)
            {
                this.myText = value;
                this.RaisePropertyChanged("MyText");
            }
        }
    }
}

我这样做是为了我可以通过接口传递我的对象,其他代码不能改变属性,但任何实际实现的代码都可以。

但是当我有一个视图模型与IThing在它和绑定到XAML的属性,我发现XAML仍然可以设置我的他们!

有哪些选项可以防止这种情况发生?谢谢你的帮助。

编辑:一些不完美的变通方法:

  1. 将实现类中的setter设置为内部设置。因为我的视图恰好在一个单独的程序集中,所以不允许XAML设置它们。但这只是一个巧合。如果我的观点在同一个集会上呢?

  2. 创建另一个类来保存我的实现类,但不提供所有属性的setter。

仍在寻找更好的选择。

我如何隐藏setter从XAML

你到底想做什么?如何在XAML中绑定它。如果你不想让XAML更新你的属性,你可以将绑定模式设置为单向。

您不能在实现中隐藏属性,因为XAML仍然可以通过反射访问这些属性。你需要提供一个具有较不可见的setter的实际实现。

或者使用Binding将Mode设置为OneWay

XAML:

{Binding Path=MyText, Mode=OneWay}

ViewModel:

public class MainWindowViewModel
{
    private readonly IThing _thing = new Thing();
    public string MyText { get { return _thing.MyText; } }
}
public interface IThing
{
    string MyText { get; }
}
public class Thing : INotifyPropertyChanged, IThing
{
    private string _myText = "Testing 1 2 3";
    string IThing.MyText
    {
        get { return _myText; }
    }
    public string MyText
    {
        get { return _myText; }
        set
        {
            if (_myText != value)
            {
                _myText = value;
                OnPropertyChanged();
            }
        }
    }
    INotifyPropertyChanged
}