1

コレクション (リスト) プロパティに、マークアップ拡張機能によって提供される値を入力しようとしています。コレクションを提供するプロパティにパブリック セッターがある場合、これを行うには問題があります。XAML 実装 (.NET 3.5 を使用) のバグだと思いますが、よくわかりません。

次のテストクラスを検討してください

[ContentProperty("SettableList")]
public class Test : FrameworkElement
{
    List<string> _settableList = new List<string>();
    List<string> _justGettableList = new List<string>();

    public List<string> SettableList { get { return _settableList; } set { _settableList = value; } }
    public List<string> JustGettableList { get { return _settableList; } }
}

次のマークアップ拡張機能は、文字列を提供するだけです。

public class ProvideStringExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return "Blah";
    }
}

これで、次のテスト ケースはすべて正常に動作します。

<!-- b) fill SettableList with explicit string: ok -->
<local:Test>
  <local:Test.SettableList>
    <sys:String>Hurz</sys:String>
  </local:Test.SettableList>
</local:Test>

<!-- c) fill JustGettableList with string from markup extension: ok -->
<local:Test>
  <local:Test.JustGettableList>
    <local:ProvideStringExtension/>
  </local:Test.JustGettableList>
</local:Test>

<!-- d) fill SettableList with string form markup extension by using "ContentProperty": ok -->
<local:Test>
  <local:ProvideStringExtension/>
</local:Test>

しかし、このテスト ケースは失敗します。

<!-- e) fill SettableList with string from markup extension: FAILS -->
<!-- Throws (tries to convert the provided string to List<string>) -->
<local:Test>
  <local:Test.SettableList>
    <local:ProvideStringExtension/>
  </local:Test.SettableList>
</local:Test>

失敗したケースでは、'string' を 'List' に変換できないという例外がスローされます。同様のケース d) と c) が正常に機能する場合、これが失敗する理由の説明はありますか?

4

1 に答える 1

0

XAMLパーサーが最初に実行しようとするのは、取得した値を取得し、プロパティをその値に「設定」することです。だからそれはこれをしたい:

this.SettableList = ProvideStringExtension.ProvideValue();

セッターがなく、プロパティがICollectionを実装している場合(おそらくIList、忘れてしまいます)、コレクションにアイテムを追加しようとします。

this.JusetGettableList.Add(ProvideStringExtension.ProvideValue())

彼らはおそらくこの論理を逆転させたかもしれませんが、私はそれをこのようにするために作られた設計上の選択があったと確信しています。

また、セッターがプライベートであっても失敗すると思います。しかし、それは修正された可能性があります。

于 2011-04-08T15:32:30.220 に答える