如何将树视图中的选定项值绑定回Silverlight中的ViewModel?

时间:2011-09-01 11:12:24

标签: c# .net 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>

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

3 个答案:

答案 0 :(得分:5)

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

 ItemsSource="{Binding ChildItems}"
 SelectedItem="{Binding SelectedChild}"

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

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

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

答案 1 :(得分:1)

尝试使用TreeView SelectedValueSelectedValuePath属性: -

<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}"
            SelectedValue="{Binding SelectedItemId, Mode=TwoWay}"
            SelectedValuePath="MenuOptionId"
        />
    </toolkit:DockPanel>
</Grid>

答案 2 :(得分:0)

为什么不使用这样的东西。

(SingleObjectInYourList)Item = treeview.SelectedItem;