C# 如何对XAML隐藏setter?

C# 如何对XAML隐藏setter?,c#,xaml,interface,hide,setter,C#,Xaml,Interface,Hide,Setter,我有一个无法设置属性的接口: 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; }

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

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仍然可以设置我的属性

有什么办法可以防止这种情况? 谢谢你的帮助

编辑: 一些不完善的变通办法:

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

  • 创建另一个包含我的实现类的类,但不提供所有属性的setter。这似乎是可行的,但不得不这么做似乎很烦人


  • 仍在寻找更好的选择

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

    由于XAML仍然可以通过反射访问属性,因此无法在实现中隐藏属性。您需要提供一个实际的实现,该实现的setter可见性较低

    或者使用将模式设置为单向

    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
    }
    

    都德,你的
    设定器是
    公共的
    。我不明白你的问题。任何通过类直接访问属性的代码都可以设置该属性。是,“任何通过类直接访问属性的代码都可以设置该属性”。但正如我所说,我的viewmodel只有界面。使用viewmodel的代码无法访问setter。。。除了XAML can.XAML不关心接口。当您的类使用公共setter实际存在时,绑定在运行时进行计算和执行。删除公共setter或将其设置为受保护的
    或其他内容。将其设置为受保护意味着只有子类才能设置属性。那不是我想要的。任何引用已实现类的代码都应该仍然能够设置属性。你很接近我找到的一个工作,那就是让它内部化。因为我的视图恰好是在另一个程序集中定义的。但这似乎更像是一个巧合。当然,可以使用单向绑定模式,但这就像将一些数据传递给其他人的代码,并说“请不要做任何更改。我知道你可以,因为我提供了setter,但请表现良好,不要这样做。”我想使用没有setter的接口,因为这是一个可靠的契约。是的,我想这可能就是XAML的工作方式。但在我看来,这是完全错误的。它应该遵守我绑定到的接口定义的契约,而不是反映到实际实现的对象接口。重复我对“VibHole”的回答:当然,可以使用单向绑定模式,但这就像将一些数据传递给其他人的代码,并说“请不要做任何更改。我知道你可以,因为我提供了setter,但请表现良好,不要这样做。”我想使用不带setter的接口,因为这是一个可靠的契约。您是否使用
    IThing
    作为数据上下文?您是如何绑定到它的?是的,它是数据上下文。我绑定到其中的属性。。。是的,Xaml不适用于接口,因为它需要一个具体的实现来绑定。为了获得功能,您应该使用viewmodel。在我上面简化的示例中,就是我的viewmodel。我想你建议它包含一个新的类,比如说MyViewModel,它只有我想要的只读属性,然后可以访问它。在我的帖子中,这是解决办法2。我认为这可能是唯一一个不是黑客攻击的解决方案,但似乎仍然没有必要。我认为XAML仍然应该尊重它绑定到的接口,即使它确实使用反射。谢谢