非常に遅れて私の答えを持つが、これはイベントトリガー(ユーザーが新しいアイテムを選択したときにバインディングを更新する)とデータトリガで行うことができ、純粋なMVVMソリューションを望む人のためのパーティーに(更新しますバインディングの値が変更されたときに選択された項目)。
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); }
}
}
ツリービューは、イベントトリガーが必要です。これは、メインのViewModelに機能するために
は、現在選択されている項目が変更されたときに呼び出される項目、現在選択されている項目のプロパティとコマンドプロパティを必要とします
<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>
DataTrig:現ノードの値はコードでプログラム的に変更されたときに、制御項目が選択を取得するようにするときの選択の変更、およびツリービューアイテムのスタイルでDataTrigger SelectedNodeChangedCommandを呼び出すためにgerは、CurrentNodeの値が現在のリスト項目のノードといつ一致するかを検出することによって機能します。
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();
}
}
WPFのTreeViewコントロールの犠牲はほとんどの人にはない機能を実現するために、ユーザビリティのすべての*最後のビットを*:それは単純な比較を行う代わりに、EqualityConverterでテストしなければならないので、残念ながらDataTriggersは、その価値をバインドすることはできませんほとんどの時間が必要なようです... –