问题描述
我试图绑定一个 Readonly
属性与 OneWayToSource
作为模式,但似乎这不能在XAML中完成:
I'm trying to bind to a Readonly
property with OneWayToSource
as mode, but it seems this cannot be done in XAML:
<controls:FlagThingy IsModified="{Binding FlagIsModified,
ElementName=container,
Mode=OneWayToSource}" />
我得到:
IsModified
是 FlagThingy
中的只读 DependencyProperty
。我想将该值绑定到容器上的 FlagIsModified
属性。
IsModified
is a readonly DependencyProperty
on FlagThingy
. I want to bind that value to the FlagIsModified
property on the container.
要清楚:
FlagThingy.IsModified --> container.FlagIsModified
------ READONLY ----- ----- READWRITE --------
是否可以使用XAML?
Is this possible using just XAML?
更新: 嗯,我通过在容器上设置绑定而不是在 FlagThingy
上来修复这种情况。但是我仍然想知道这是否可行。
Update: Well, I fixed this case by setting the binding on the container and not on the FlagThingy
. But I'd still like to know if this is possible.
推荐答案
OneWayToSource的一些研究成果...
Some research results for OneWayToSource...
1。
// Control definition
public partial class FlagThingy : UserControl
{
public static readonly DependencyProperty IsModifiedProperty =
DependencyProperty.Register("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());
}
<controls:FlagThingy x:Name="_flagThingy" />
// Binding Code
Binding binding = new Binding();
binding.Path = new PropertyPath("FlagIsModified");
binding.ElementName = "container";
binding.Mode = BindingMode.OneWayToSource;
_flagThingy.SetBinding(FlagThingy.IsModifiedProperty, binding);
选项#2
// Control definition
public partial class FlagThingy : UserControl
{
public static readonly DependencyProperty IsModifiedProperty =
DependencyProperty.Register("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());
public bool IsModified
{
get { return (bool)GetValue(IsModifiedProperty); }
set { throw new Exception("An attempt ot modify Read-Only property"); }
}
}
<controls:FlagThingy IsModified="{Binding Path=FlagIsModified,
ElementName=container, Mode=OneWayToSource}" />
选项#3(True只读依赖属性)
Option # 3 (True read-only dependency property)
System.ArgumentException:'IsModified'属性不能被数据绑定。
System.ArgumentException: 'IsModified' property cannot be data-bound.
// Control definition
public partial class FlagThingy : UserControl
{
private static readonly DependencyPropertyKey IsModifiedKey =
DependencyProperty.RegisterReadOnly("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());
public static readonly DependencyProperty IsModifiedProperty =
IsModifiedKey.DependencyProperty;
}
<controls:FlagThingy x:Name="_flagThingy" />
// Binding Code
Same binding code...
反射器给出答案:
internal static BindingExpression CreateBindingExpression(DependencyObject d, DependencyProperty dp, Binding binding, BindingExpressionBase parent)
{
FrameworkPropertyMetadata fwMetaData = dp.GetMetadata(d.DependencyObjectType) as FrameworkPropertyMetadata;
if (((fwMetaData != null) && !fwMetaData.IsDataBindingAllowed) || dp.ReadOnly)
{
throw new ArgumentException(System.Windows.SR.Get(System.Windows.SRID.PropertyNotBindable, new object[] { dp.Name }), "dp");
}
....
这篇关于OneWayToSource从XAML中的readonly属性绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!