我有一个无法设置属性的界面:
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。这似乎可行,但似乎很烦人。
仍在寻找更好的选择。
答案 0 :(得分:0)
你到底想要做什么?你如何在XAML中绑定它。如果您不希望XAML更新您的属性,可以将绑定模式设置为OneWay。
答案 1 :(得分:0)
您无法在实施中隐藏属性,因为XAML仍然可以通过反射访问属性。您需要提供一个具有较低可见性的setter的实际实现。
或者使用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
}