1. ホーム
  2. wpf

[解決済み] XAMLにおけるreadonlyプロパティからのOneWayToSourceバインディング

2023-04-01 17:31:31

質問

をバインドしようとしています。 Readonly プロパティに OneWayToSource をモードとして使用することができますが、これはXAMLでは行えないようです。

<controls:FlagThingy IsModified="{Binding FlagIsModified, 
                                          ElementName=container, 
                                          Mode=OneWayToSource}" />

得ることができる。

プロパティ 'FlagThingy.IsModified' は、アクセス可能なセットアクセッサを持っていないため、設定できません。

IsModified は読み出し専用の DependencyPropertyFlagThingy . その値を FlagIsModified プロパティにバインドしたい。

明確にするために

FlagThingy.IsModified --> container.FlagIsModified
------ READONLY -----     ----- READWRITE --------

XAMLだけで可能でしょうか?


更新しました。 さて、私はこのケースを、バインディングをコンテナに設定することで、解決しました。 FlagThingy . しかし、私はまだこれが可能であるかどうかを知りたいです。

どのように解決するのですか?

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 (真の読み取り専用依存性プロパティ)

System.ArgumentException: 'IsModified' プロパティをデータバインドすることはできません。

// 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...

Reflectorが答えを出します。

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");
    }
 ....