muy tarde a la fiesta con mi respuesta, pero para aquellos que quieran una solución MVVM pura esto se puede hacer con un disparador de eventos (para actualizar la unión cuando el usuario selecciona un elemento nuevo) y un activador de datos (para actualizar el elemento seleccionado cuando cambia el valor de la vinculación).
Para que esto funcione el principal modelo de vista las necesidades de los artículos, una propiedad para el elemento seleccionado en ese momento y una propiedad de comando que se llama cuando cambia el elemento seleccionado actualmente:
public class MainViewModel : ViewModelBase
{
// the currently selected node, can be changed programmatically
private Node _CurrentNode;
public Node CurrentNode
{
get { return this._CurrentNode; }
set { this._CurrentNode = value; RaisePropertyChanged(() => this.CurrentNode); }
}
// called when the user selects a new node in the tree view
public ICommand SelectedNodeChangedCommand { get { return new RelayCommand<Node>(OnSelectedNodeChanged); } }
private void OnSelectedNodeChanged(Node node)
{
this.CurrentNode = node;
}
// list of items to display in the tree view
private ObservableCollection<Node> _Items;
public ObservableCollection<Node> Items
{
get { return this._Items; }
set { this._Items = value; RaisePropertyChanged(() => this.Items); }
}
}
El TreeView necesita una activación de un evento llamar SelectedNodeChangedCommand cuando cambia la selección, y un DataTrigger en el estilo TreeViewItem para que los elementos de control de ser seleccionado cuando el valor de CurrentNode se cambia mediante programación en el código:
<TreeView x:Name="treeView" ItemsSource="{Binding Items}"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd ="http://www.galasoft.ch/mvvmlight">
<TreeView.Resources>
<conv:EqualityConverter x:Key="EqualityConverter" />
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
<Setter Property="IsSelected" Value="False" />
<Style.Triggers>
<!-- DataTrigger updates TreeViewItem selection when vm code changes CurrentNode -->
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource EqualityConverter}">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type TreeView}}" Path="DataContext.CurrentNode" />
<Binding />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="IsSelected" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
<!-- *** HierarchicalDataTemplates go here *** -->
</TreeView.Resources>
<!-- EventTrigger invokes SelectedNodeChangedCommand when selection is changed by user interaction -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<cmd:EventToCommand Command="{Binding SelectedNodeChangedCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
el DataTrig ger funciona al detectar cuando el valor de CurrentNode coincide con el nodo para el elemento de la lista actual. Desafortunadamente DataTriggers no pueden obligar a su valor, por lo que tiene que probar con una EqualityConverter lugar, que sólo hace una comparación sencilla:
public class EqualityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[0] == values[1];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
sacrificios TreeView de WPF * * cada último bit de usabilidad para lograr características que la mayoría de las personas no lo hacen parece necesitar la mayor parte del tiempo ... –