2010-06-07 2 views
7

Так у меня есть TreeView, который выглядит примерно так:Binding выбор TreeView к ViewModel

<TreeView Name="elementTreeView" 
         ItemsSource="{Binding Elements}" 
         Width="Auto" 
         SelectedValuePath="Path" /> 

У меня также есть TextBlock определяется следующим образом:

<TextBlock Text="{Binding ElementName=elementTreeView, Path=SelectedValue}" /> 

Мой ModelView является довольно простой и содержит ровно что вы ожидаете. Я ищу способ привязать свойство в моей ViewModel к SelectedValue. Прямо сейчас текстовый блок отображает то, что мне нужно. Есть ли простой способ связать это свойство?

+0

Не совсем уверен, что вы спрашиваете. Вы хотите, чтобы TreeView обновлял свойство SelectedValue VM или свойство SelectedValue VM для обновления TreeView? – hemp

+0

Извините, если мой вопрос был не совсем понятен. Я еще не знаком с WPF. Я хочу, чтобы TreeView обновлял свойство SelectedValue VM. Я также пытаюсь сделать это, используя привязку вместо события SelectedItemChanged, чтобы правильно сохранить шаблон MVVM. – LandonSchropp

ответ

4

Получается, что это результат неправильного следования шаблону MVVM. Решением было просто использовать один объект ViewModel. Внутри ViewModel (чей тип ElementViewModel) объекта, у меня было что-то вроде:

public ElementViewModel Element { 
    get { 
     return this; 
    } 
} 

Тогда мой TreeView заявление выглядело примерно так:

<TreeView Name="treeView" 
      ItemsSource="{Binding Elements}" 
      Width="Auto" 
      SelectedValuePath="Element" /> 

После этого, все, что я должен был сделать привязывать к Элементу в моем другом представлении.

0

Вы можете использовать BindingMode OneWayToSource, чтобы привязать свойство TreeView's SelectedValue к вашей ViewModel. Затем привяжите свойство TextBlock Text с помощью привязки OneWay к тому же свойству ViewModel.

+0

Проблема заключается в том, что SelectedValue доступен только для чтения, поэтому он не позволит мне напрямую привязываться к нему. – LandonSchropp

+0

Режим привязки OneWayToSource позволяет работать только с свойствами чтения и без зависимостей; поэтому я и предложил. Этот метод может работать даже при плохой реализации MVVM. – hemp

-1

Вы можете связать TreeView к свойству на вашей ViewModel непосредственно:

Это связывается со свойством «SelectedItem» в VM.

<TreeView Name="elementTreeView" 
        ItemsSource="{Binding Elements}" 
        SelectedValue="{Binding SelectedItem, Mode=OneWayToSource}" 
        Width="Auto" 
        SelectedValuePath="Path" /> 
+0

Когда я пытаюсь сделать это, я получаю следующую ошибку сборки: Свойство SelectedValue доступно только для чтения и не может быть установлено из разметки. – LandonSchropp

+0

@helixed: Извините - это shoudl be onewaytosource –

+0

Это все еще приводит к ошибке привязки. – Justin