2013-08-28 20 views
2

動態生成ViewModel我有一個模型類,其中包含可以對其執行的命令操作數組。這個想法是,用於編輯該模型實例的UI可以在運行時動態生成;我打算使用動態XAML創建。到現在爲止還挺好。從Model

但是,ViewModel是另一回事。問題在於我的動態UI元素綁定了什麼 - 他們需要ViewModel中的一個屬性進行綁定,所以看起來我需要動態地將屬性添加到VM實例,並突然顯得非常混亂。

另外,如果綁定可以發送一個額外的參數,允許我綁定到一個單一的屬性,然後使用該參數來決定如何處理該值,那麼這將是一個更清潔和更簡單的解決方案。

或者:我不知道或沒有考慮過的事情。

回答

3

我已經成功使用動態視圖模型對象ICustomTypeProvider - 它允許您動態創建可在運行時建立的綁定點。

http://blogs.msdn.com/b/silverlight_sdk/archive/2011/04/26/binding-to-dynamic-properties-with-icustomtypeprovider-silverlight-5-beta.aspx

請記住的是,如果你打算做任何事情比標準的CRUD屏幕比較複雜,試圖建立一個動態的MVVM系統是不平凡的。你失去了附加的屬性,附加的行爲,並插入WPF的好東西,如類型轉換器和隱式類型的ViewModel通過DataTemplates渲染變得有問題。

編輯:對於WPF,你可能會使用等效ICustomTypeDescriptor

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> 

如果速度是有意義的你,那麼你的選擇是發光視圖模式l運行時的類型(請參見System.Reflection.Emit中的類型)。