如何将SelectedItemValue从TreeView绑定回Silverlight中的ViewModel?

Mal*_*ker 2 .net c# silverlight

我有一个TreeView项和一个相应的TreeViewModel.我想在TreeViewModel上支持一个属性,该属性可以跟踪TreeView中当前选定的项目.

这是我的代码:

<UserControl.DataContext>
    <vm:TreeMenuViewModel />
</UserControl.DataContext>

<UserControl.Resources>
    <common:HierarchicalDataTemplate x:Key="MenuItemsTemplate" 
                                     ItemsSource="{Binding ChildItems}">
        <TextBlock Text="{Binding MenuOption}"/>
    </common:HierarchicalDataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <toolkit:DockPanel>
        <sdk:TreeView 
            Name="treeView1" 
            VerticalAlignment="Stretch" 
            toolkit:DockPanel.Dock="Left"  
            Background="Transparent"
            ItemsSource="{Binding ChildItems}"
            ItemTemplate="{StaticResource MenuItemsTemplate}"                  
            >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectedItemChanged">
                    <ei:ChangePropertyAction 
                         TargetObject="{Binding}" 
                         PropertyName="SelectedItemId" 
                         Value="{Binding MenuOptionId}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </sdk:TreeView>
    </toolkit:DockPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)

TreeView正确绑定和显示数据.触发器也在工作并且定位正确的属性 - 当我在TreeViewModel中的SelectedItemId属性中断时,属性被命中,但提供的值始终为0.我如何提供所选项的值?

Hen*_*man 5

只需删除整个触发器并添加:

 ItemsSource="{Binding ChildItems}"
 SelectedItem="{Binding SelectedChild}"
Run Code Online (Sandbox Code Playgroud)

然后您的ViewModel需要SelectedChild属性.您的VM可以对该属性的setter的更改做出反应.

如果您想要双向绑定,请将其设为NotifyChange属性.

我想你想要id:SelectedChild.Id或类似的东西.