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仍然可以设置我的属性
有什么办法可以防止这种情况?
谢谢你的帮助
编辑:
一些不完善的变通办法:
仍在寻找更好的选择 你到底想做什么?如何在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仍然应该尊重它绑定到的接口,即使它确实使用反射。谢谢