2010-06-07 14 views
7

więc mam TreeView, który wygląda mniej więcej tak:Binding wybór TreeView do ViewModel

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

Mam też TextBlock zdefiniowane następująco:

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

Moja ModelView jest dość prosty i zawiera dokładnie czego można się spodziewać. To, czego szukam, to sposób na powiązanie właściwości w moim ViewModel z SelectedValue. Teraz blok tekstu wyświetla to, czego potrzebuję. Czy istnieje jakiś prosty sposób związania tej właściwości?

+0

Nie całkiem jestem pewien, o co pytasz .. Czy chcesz, aby TreeView aktualizował właściwość SelectedValue VM, czy właściwość SelectedValue maszyny VM, aby zaktualizować TreeView? – hemp

+0

Przepraszam, jeśli moje pytanie nie było całkiem zrozumiałe. Wciąż jestem nowy w WPF. Chcę, aby TreeView zaktualizował właściwość SelectedValue maszyny VM. Próbuję również zrobić to przy użyciu wiązania zamiast zdarzenia SelectedItemChanged, aby poprawnie zachować wzorzec MVVM. – LandonSchropp

Odpowiedz

4

Okazuje się, że jest to wynikiem nieprzestrzegania wzoru MVVM. Rozwiązaniem było użycie tylko jednego obiektu ViewModel. Wewnątrz ViewModel (którego typ jest ElementViewModel) obiektu, miałem coś takiego:

public ElementViewModel Element { 
    get { 
     return this; 
    } 
} 

Wtedy moja deklaracja TreeView wyglądał mniej więcej tak:

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

Po tym, wszystko, co musiałem zrobić, to wiążą do elementu w moim drugim widoku.

0

Możesz użyć trybu BindingMode z OneWayToSource, aby powiązać właściwość TreeView z SelectedValue z ViewModel. Następnie należy powiązać właściwość Text Text Lock z powiązaniem OneWay z tą samą właściwością ViewModel.

+0

Problem wydaje się, że SelectedValue jest tylko do odczytu, więc nie pozwala mi bezpośrednio do niego powiązać. – LandonSchropp

+0

Tryb bindowania OneWayToSource umożliwia pracę z właściwościami tylko do odczytu i bez zależności; dlatego to zasugerowałem. Ta technika może działać, nawet przy złej implementacji MVVM. – hemp

-1

można związać z TreeView do nieruchomości na ViewModel bezpośrednio:

Będzie to wiązać się z „selectedItem” własności w VM.

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

Gdy próbuję to zrobić, otrzymuję następujący błąd kompilacji: Właściwość "SelectedValue" jest tylko do odczytu i nie można jej ustawić na podstawie znaczników. – LandonSchropp

+0

@helixed: Przepraszam - to musi być Onewaytosource –

+0

To nadal powoduje błąd wiązania. – Justin

Powiązane problemy