1

我有一个无法设置属性的接口:

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. 使实现类中的设置器成为内部的。由于碰巧我的视图位于单独的程序集中,因此不允许 XAML 设置它们。但这只是巧合。如果我的观点在同一个程序集中怎么办?

  2. 创建另一个包含我的实现类的类,但不提供所有属性的设置器。这似乎可行,但似乎很烦人。

仍在寻找更好的选择。

4

2 回答 2

0

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

或者使用 将Binding模式设置为OneWay

XAML:

{Binding Path=MyText, Mode=OneWay}

视图模型:

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
}
于 2013-03-19T17:09:36.067 回答
0

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

于 2013-03-19T17:05:48.073 回答