Ссылка на UIElement в ViewModel из XAML - PullRequest
1 голос
/ 17 февраля 2011

Я относительно новичок в использовании WPF и архитектуры MVVM. У меня есть вопрос о ссылках UIelements из окна XAML DataContext.

У меня есть пункты меню, связанные с представлениями DataContext с использованием этого синтаксиса:

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

Я бы хотел использовать аналогичную парадигму для добавления элементов в сетку. Прямо сейчас я использую класс WorkflowDesigner. Я могу добавить его в свою сетку, используя следующий код в моей ViewModel:

grid.AddChildren(wd.View)

где представление имеет тип UIElement.

Что бы я предпочел сделать, так это добавить ссылку на нее из моего файла XAML, не помещая ничего в код, чтобы я мог использовать XAML в основном в качестве обложки. Можно ли использовать тег, который просто берет его UIElement из текста данных файла XAML?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Это возможно, но MVVM не в духе, чтобы ваша ViewModel предоставляла элементы управления вашему представлению.В идеале ваша ViewModel вообще не должна зависеть от System.Windows.Controls.

Если вам нужно, то вы можете использовать ContentControl:

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

.создайте класс ViewLocator и поместите его экземпляр в словарь ресурсов.Тогда используйте это:

<ContentControl Content={Binding Source={StaticResource ViewLocator}, Path=WorkflowDesigner} />
0 голосов
/ 26 февраля 2011

Я не уверен, что я полностью понимаю вашу проблему, но если у вас есть класс, который вы хотите представить в своем представлении из вашей ViewModel, вы можете использовать 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;
        }
    }
}

В UserView вы можете иметь

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

Таким образом, пользователь будет представлен в представлении с использованием шаблонаобъявлено выше.Тогда вам не придется использовать UIElement s в вашей ViewModel.

ItemsControl может относиться к элементам сетки и иметь элементы, представленные в сетке с SharedGridScope (если я правильно помню).

...