2011-02-16 28 views
1

我對使用WPF和MVVM體系結構比較陌生。我有一個關於從XAML窗口的DataContext引用UIelements的問題。從XAML引用ViewModel中的UIElement

我有綁定到使用此語法查看DataContext菜單項:

<MenuItem Header="About" Command="{Binding AboutCommand}" /> 

我想使用類似的範例項目添加到網格。現在我正在使用一個類WorkflowDesigner。我可以在我的ViewModel使用下面的代碼添加到我的網格:

grid.AddChildren(wd.View) 

,其中的觀點是UIElement類型。

我寧願做的就是添加是從我的XAML文件中引用它,而不在我的代碼隱藏中放置任何東西,這樣我就可以主要將XAML用作皮膚。是否有可能使用標記僅從XAML文件的datacontext中獲取其UIElement

回答

4

這是可能的,但它不符合MVVM的精神,讓您的ViewModel爲您的視圖提供控件。理想情況下,你的ViewModel應該完全不依賴於System.Windows.Controls。

如果必須,那麼你可以使用一個ContentControl

<ContentControl Content={Binding wd.View} /> 

爲了解決這個問題我想創建一個ViewLocator類,並把它的一個實例到你的資源字典。然後用這個:

<ContentControl Content={Binding Source={StaticResource ViewLocator}, Path=WorkflowDesigner} /> 
0

我不知道如果我很理解你的問題,但如果你有你希望存在於您的視圖模型視圖類,你可以使用一個ItemsControl使用,以顯示不同類別一個DataTemplate

假設你有一流的User

public class User 
{ 
    public string Id { get; set;} 
    public string Name { get; set;} 
} 


public class UserViewModel 
{ 
    private ObservableCollectionaUser<User> _users = new...... 
    public ObservableCollection<User> Users 
    { 
     get 
     { 
      return _users; 
     } 
    } 
} 

在用戶視圖,你可以有

<ItemsControl ItemsSource="{Binding Users}"> 
    <ItemsControl.Resources> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Id}" /> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.Resources> 
</ItemsControl> 

這樣一來,用戶將在視圖中使用上述聲明的模板呈現。那麼你不必在ViewModel中使用UIElement

ItemsControl可能會引用網格項目,並使用SharedGridScope在網格中顯示項目(如果我沒有記錯的話)。

相關問題