我有一个模型类,其中包含可以对其执行的命令操作数组。想法是用于编辑该模型实例的UI可以在运行时动态生成;我打算使用动态XAML创建。到目前为止,非常好。
然而,ViewModel是另一回事。问题是我的动态UI元素绑定到了什么 - 他们需要ViewModel中的属性来绑定,所以看起来我需要动态地向VM实例添加属性,突然看起来非常混乱。
或者,如果绑定可以发送一个额外的参数,允许我绑定到单个属性,然后使用该参数来决定如何处理该值,那么这将是一个更简洁的解决方案。
或者:我不知道或没有考虑的事情。
答案 0 :(得分: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
中的类型)。
答案 1 :(得分:3)
我使用ICustomTypeProvider
成功使用动态viewmodel对象 - 它允许您动态创建可在运行时构建的绑定点。
请记住,如果您计划执行比标准CRUD屏幕更复杂的任何事情,那么尝试构建动态MVVM系统并非易事。你失去了附加属性,附加行为和插入WPF好东西,如类型转换器和通过DataTemplates隐式类型的ViewModel渲染成为问题。
编辑:对于WPF,您可能会使用等效的ICustomTypeDescriptor