1

int や List などのパブリック プロパティを含む C# WPF コンポーネント (VS2010 バージョン 10.0.40219.1 SP1Rel) に取り組んでいます。

.xaml の結果の xml-block は次のようになるため、コンポーネントは VS2010 wpf エディターによって正常にシリアル化されているようです。

<Parent>
    <NumberProperty>10</NumberProperty>
    <ListProperty>
        <Item>
            blah
        </Item>
    </ListProperty>
</Parent>

コンポーネントを逆シリアル化する (つまり、アプリケーションを実行する) と、List プロパティが読み取られ (getter が実行され)、そこに item が追加されます。リストに対してセッターは実行されません。

問題は、リストに意図的にデフォルトのアイテムが含まれていることです。これは、アイテムの親コンストラクターでリストに追加されます。これら/この既存のアイテムは、関連する xaml で利用可能な場合、リスト内のアイテムに置き換える必要があります。

DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)運が悪いリスト属性として試しました。

では、項目を追加するのではなく、リスト プロパティを置き換える (セッターを呼び出す) 必要があることを、環境への属性によって伝えることは可能ですか?

4

2 に答える 2

0

私はこれが古い問題であることを知っています.1つの解決策はずっと前に発見されましたが、とにかく. リストを使用してアイテムを追加する必要があるため、リストが置き換えられます。そのようです:

<Parent>
<NumberProperty>10</NumberProperty>
<ListProperty>
    <List>
        <Item>
            blah
        </Item>
    </List>
</ListProperty>
于 2021-07-02T10:20:36.050 に答える
0

これはヘッドスクラッチャーです:)

あなたが言うように、いくつかのデフォルト値でリスト プロパティを初期化すると、それらはデザイナーに表示されません。リストにいくつかの値を追加すると、それらは .xaml にシリアル化され、これらの値は置き換えられるのではなく、実行時に既定値に追加されます。

1 つの解決策は、デフォルト値 (または値) が含まれていることを認識し、最初の新しい項目がリストに追加されたときにそれ (またはそれら) を削除するカスタム コレクションを使用することです。

例えば

public partial class UserControl1
{
    public UserControl1()
    {
        // initialise collection with '1' - doesn't appear in design time properties
        Ids = new MyCollection<int>(1);

        InitializeComponent();
    }

    public int Id { get; set; }

    public MyCollection<int> Ids { get; set; }
}

public class MyCollection<T> : Collection<T>
{
    private readonly T _defaultValue;
    private bool _hasDefaultValue;

    public MyCollection(T defaultValue)
    {
        _defaultValue = defaultValue;

        try
        {
            _hasDefaultValue = false;

            Add(defaultValue);
        }
        finally
        {
            _hasDefaultValue = true;
        }
    }

    protected override void InsertItem(int index, T item)
    {
        base.InsertItem(index, item);

        if (_hasDefaultValue)
        {
            Remove(_defaultValue);
            _hasDefaultValue = false;
        }
    }
}

Xaml

    <local:UserControl1 Id="5">
        <local:UserControl1.Ids>
            <System:Int32>2</System:Int32>
            <System:Int32>3</System:Int32>
            <System:Int32>4</System:Int32>
        </local:UserControl1.Ids>
    </local:UserControl1>

特に満足のいく解決策とは言えませんが、問題は解決すると思います。

于 2012-10-16T22:29:32.507 に答える