Как я могу получить доступ к DependencyProperties моего ViewModel в XAML? - PullRequest
2 голосов
/ 31 января 2012

В настоящее время я пишу пользовательский элемент управления с шаблоном MVVM, который имеет некоторые свойства, например, Документ.

DependencyProperty в ViewModel

public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document", typeof(MyDocument), typeof(ResultControlViewModel), new PropertyMetadata(OnDocumentChanged));

        public MyDocument Document
        {
            get { return (MyDocument)GetValue(DocumentProperty); }
            set { SetValue(DocumentProperty, value); }
        }

MainView, которые используют пользовательский элемент управления

<control:ResultControl x:Name="myControl" />

Как я могу использовать свое свойство "Document" из ViewModel, чтобы связать их в XAML с выбранным элементом ListBox в MainView, например?

Programmaticlly. Я могу написать метод в коде моего пользовательского элемента управления, но я думаю, что это не самый лучший способ сделать это. Особенно в отношении использования шаблона MVVM.

Ответы [ 3 ]

1 голос
/ 31 января 2012

Предполагая, что класс MainViewModel имеет свойства Documents и Document (т.е. текущий документ), XAML должен выглядеть следующим образом:

<ListBox ItemsSource={Binding Path=Documents}, SelectedItem={Binding Path=Document}>
...
</ListBox>

<control:ResultControl DataContext={Binding Path=Document, Mode=OneWay} />
0 голосов
/ 31 января 2012

Вам необходимо привязать свойство Document к свойству в вашей модели представления:

<control:ResultControl x:Name="myControl" Document="{Binding VmDocument}"/>

А в вашей ViewModel:

public MyDocument VmDocument {get;set;}

Конечно, VmDocument должен вызывать событие PropertyChangedна его установщик.

0 голосов
/ 31 января 2012

Я не совсем уверен, что вы после. Вы имеете в виду, что ваш ListBox - это коллекция ViewModels "Document"? Если это так, вы можете привязать свой UserControl к выбранному «Документу» с помощью:

<ListBox x:Name="MyListBox" ItemsSource="{Binding MyDocumentCollection}" />

<control:ResultControl x:Name="myControl" DataContext={Binding ElementName="MyListBox", Path="SelectedItem"}/>

РЕДАКТИРОВАТЬ: Серж ответ лучше в отношении MVVM. Наличие выбранного элемента в качестве свойства в вашей ViewModel.

...