我有一个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.我如何提供所选项的值?
答案 0 :(得分:5)
只需移除整个触发器并添加:
ItemsSource="{Binding ChildItems}"
SelectedItem="{Binding SelectedChild}"
然后您的ViewModel需要一个SelectedChild属性。您的VM可以对该属性的setter的更改做出反应。
如果您想要双向绑定,请将其设为NotifyChange属性。
我认为你想要id:SelectedChild.Id或类似的东西。
答案 1 :(得分:1)
尝试使用TreeView
SelectedValue
和SelectedValuePath
属性: -
<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;