2010-06-07 12 views
7

Così ho un TreeView che sembra qualcosa di simile:selezione TreeView rilegatura a ViewModel

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

Ho anche un TextBlock definito come segue:

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

mio modelview è piuttosto semplice e contiene esattamente cosa ti aspetteresti. Quello che sto cercando è un modo per associare una proprietà nel mio ViewModel a SelectedValue. In questo momento, il blocco di testo mostra ciò di cui ho bisogno. C'è un modo semplice per legare questa proprietà?

+0

Non completamente sicuro di quello che stai chiedendo .. Vuoi che TreeView aggiorni la proprietà SelectedValue della VM o la proprietà SelectedValue della VM per aggiornare TreeView? – hemp

+0

Scusa se la mia domanda non è stata del tutto comprensibile. Sono ancora nuovo a WPF. Voglio che TreeView aggiorni la proprietà SelectedValue della VM. Sto anche cercando di farlo usando l'associazione invece dell'evento SelectedItemChanged per mantenere correttamente il pattern MVVM. – LandonSchropp

risposta

4

Quindi risulta che questo è il risultato di non seguire correttamente il pattern MVVM. La soluzione era usare solo un oggetto ViewModel. All'interno del ViewModel (il cui tipo è ElementViewModel) oggetto, ho avuto qualcosa di simile:

public ElementViewModel Element { 
    get { 
     return this; 
    } 
} 

Poi la mia dichiarazione TreeView sembrava qualcosa di simile:

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

Dopo di che, tutto quello che dovevo fare era bind a Elemento nella mia altra vista.

0

È possibile utilizzare un BindingMode di OneWayToSource per associare la proprietà SelectedValue di TreeView al ViewModel. Quindi associare la proprietà Text di TextBlock utilizzando un binding OneWay alla stessa proprietà ViewModel.

+0

Il problema sembra essere che SelectedValue è di sola lettura, quindi non mi consente di collegarlo direttamente ad esso. – LandonSchropp

+0

La modalità di associazione OneWayToSource consente di aggirare le proprietà di sola lettura e di non dipendenza; è per questo che l'ho suggerito. Questa tecnica può funzionare, anche con una cattiva implementazione MVVM. – hemp

-1

È possibile associare il controllo TreeView a una proprietà sulla vostra ViewModel direttamente:

Questo legherà alla proprietà "SelectedItem" nella VM.

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

Quando provo a fare questo ottengo il seguente errore di build: La proprietà 'SelectedValue' è di sola lettura e non può essere impostata dal markup. – LandonSchropp

+0

@helixed: Mi spiace: si tratta di una fonte di traffico limitato –

+0

Ciò comporta ancora un errore di associazione. – Justin