2

実行できるコマンド操作の配列を含むモデル クラスがあります。アイデアは、そのモデル インスタンスを編集するための UI を実行時に動的に生成できるということです。これは、動的 XAML 作成を使用して行うつもりです。ここまでは順調ですね。

ただし、ViewModel はまったく別のものです。問題は、動的 UI 要素が何にバインドされるかです。バインド先の ViewModel のプロパティが必要なため、VM インスタンスにプロパティを動的に追加する必要があるように見えますが、突然、非常に面倒です。

あるいは、バインドが追加のパラメーターを送信して、単一のプロパティにバインドできるようにし、そのパラメーターを使用して値の処理方法を決定できる場合、それはよりクリーンでシンプルなソリューションになります。

または:私が知らない、または考慮していないもの。

4

2 に答える 2

4

最も簡単なオプションはExpandoObject、ビュー モデル (またはDynamicObjectカスタム動作を追加する場合は に基づくクラス)に使用することです。

public class MyEditor
{
    public MyEditor()
    {
        Items = new ObservableCollection<ExpandoObject>
        {
            CreateItem(1, "John"),
            CreateItem(2, "Mary"),
            CreateItem(3, "Peter"),
            CreateItem(4, "Sarah")
        };
    }

    private ExpandoObject CreateItem(int id, string name)
    {
        dynamic item = new ExpandoObject();

        item.Id = id;
        item.Name = name;

        return item;
    }

    public ObservableCollection<ExpandoObject> Items { get; private set; }
}

XAML:

    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>

速度が重要な場合は、実行時にビュー モデル タイプを発行することを選択します (「タイプ」を参照System.Reflection.Emit)。

于 2013-08-28T11:02:37.883 に答える