2010-06-07 12 views
7

Así que tengo un TreeView que se ve algo como esto:selección TreeView obligatorio para ViewModel

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

También he TextBlock se define de la siguiente manera:

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

Mi modelview es bastante básico y contiene exactamente lo que esperarías Lo que estoy buscando es una forma de enlazar una propiedad en mi ViewModel con SelectedValue. En este momento, el bloque de texto muestra lo que necesito. ¿Hay alguna manera fácil de vincular esta propiedad?

+0

No estoy del todo seguro de lo que está preguntando .. ¿Desea que TreeView actualice la propiedad SelectedValue de la VM o la propiedad SelectedValue de la VM para actualizar TreeView? – hemp

+0

Lo siento si mi pregunta no fue del todo comprensible. Todavía soy nuevo en WPF. Quiero que TreeView actualice la propiedad SelectedValue de la VM. También intento hacerlo mediante el enlace en lugar del evento SelectedItemChanged para mantener el patrón MVVM correctamente. – LandonSchropp

Respuesta

4

Por lo tanto, resulta que esto es el resultado de no seguir el patrón de MVVM correctamente. La solución fue simplemente usar un objeto ViewModel. Dentro del modelo de vista (cuyo tipo es ElementViewModel) objeto, que tenía algo así como:

public ElementViewModel Element { 
    get { 
     return this; 
    } 
} 

Entonces mi declaración TreeView se veía algo como esto:

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

Después de eso, todo lo que tenía que hacer era unen a Element en mi otra vista.

0

Puede usar un BindingMode de OneWayToSource para enlazar la propiedad SelectedValue de TreeView a su ViewModel. A continuación, vincule la propiedad TextBlock's Text utilizando un enlace OneWay a la misma propiedad ViewModel.

+0

Parece que el problema es que SelectedValue es de solo lectura, por lo que no me permitirá vincularlo directamente. – LandonSchropp

+0

El modo de enlace OneWayToSource le permite trabajar alrededor de las propiedades de solo lectura y de no dependencia; es por eso que lo sugerí. Esta técnica puede funcionar, incluso con una mala implementación de MVVM. – hemp

-1

Puede obligar a la TreeView a una propiedad en su modelo de vista directa:

Este se unirá a la propiedad "SelectedItem" en la máquina virtual.

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

Cuando intento hacer esto, aparece el siguiente error de compilación: La propiedad 'SelectedValue' es de solo lectura y no se puede establecer desde el marcado. – LandonSchropp

+0

@helixed: Lo siento, debería ser onewaytosource –

+0

Esto todavía resulta en un error de enlace. – Justin