我在CLR属性上使用WPF的双向绑定,该属性实现了INotifyPropertyChanged。
该属性的set
为internal
,而get
为public
。
不幸的是,我收到以下错误:
System.Windows.Markup.XamlParseException未处理 消息:类型' System.Windows.Markup.XamlParseException'的未处理异常发生在PresentationFramework.dll中 附加信息:TwoWay或OneWayToSource绑定无法在只读属性' Name'类型' MyType'。
这是预期的行为吗?我本以为内部制定者应该工作得很好......
请注意,CLR类型在另一个程序集中定义,并且在当前程序集中可见,并具有[assembly: InternalsVisibleTo("MyAssembly")]
属性。
有没有人有解决方法/建议?声明程序集是一个类库,因此我无法将set
更改为public
。
答案 0 :(得分:0)
哦,我的......我刚刚发现,WPF绑定不适用于内部属性。哦,微软......你在想什么?
<强>更新强>
这是我迄今为止所理解的(谢谢你,@ Grx70):
internal
成员。[assembly: InternalsVisibleTo("XXX")]
属性,但截至目前,WPF忽略了它 - 遗憾的是,它没有任何简单的解决方法。
注意:我使用InternalVisibleTo
进行了测试 - 包括Signed和Unsigned,以及PresentationFramework,PresentationCore和一大堆其他没有运气的DLL。 面对这个问题的任何人都是最好的。
答案 1 :(得分:0)
您可以创建自己的新公共包装器属性,并使用它的getter和setter与您的内部属性进行交互
internal string _SideTabHeader;
public string SideTabHeader
{
get { return _SideTabHeader; }
set
{
if( value<0)
{
do nothing
}
else
{
_SideTabHeader=value;
};
}
}
答案 2 :(得分:0)
这很晚了,还没有解决最初的问题,但是由于它非常相关,可以帮助其他人解决类似的问题...
如果您的内部媒体资源类型为枚举,否则跳过
就我而言,我试图将WPF xaml绑定到从WCF服务继承的类型的属性。解决该简单情况的简单方法是使用int。
public Dictionary<int, string> ProductsList => EnumExtensions.ProductsList;
public int ProductType
{
get { return (int)_DeliveryProduct.ProductType; }
set
{
if (value.Equals(ProductType)) return;
_DeliveryProduct.ProductType = (ProductEnum)value;
RaisePropertyChanged(() => ProductType);
}
}
_DeliveryProduct 是我对域对象的引用,其属性 ProductType 是一个枚举,但在我的视图模型中,该属性是 int 。 ...请注意, ProductEnum 是从API自动生成的,不能更改为public。
internal static Dictionary<int, string> ProductsList => new Dictionary<int, string>
{
{(int)ProductEnum.Regular, ProductEnum.Regular.GetDisplayName()},
{(int)ProductEnum.Intermediate, ProductEnum.Intermediate.GetDisplayName()},
{(int)ProductEnum.Super, ProductEnum.Super.GetDisplayName()},
{(int)ProductEnum.Diesel, ProductEnum.Diesel.GetDisplayName()}
};