gpt4 book ai didi

c# - 将命令附加到 TreeView 子项 - 嵌套子项不同

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:29 25 4
gpt4 key购买 nike

我正在使用此处的代码:WPF/MVVM - how to handle double-click on TreeViewItems in the ViewModel? ,来自接受的答案。我的 xaml 是这样的:

<TreeView CommandBehaviors:MouseDoubleClick.Command="{Binding ConnectServer}" CommandBehaviors:MouseDoubleClick.CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}" 
Grid.Column="0" HorizontalAlignment="Stretch" DockPanel.Dock="Left" ItemsSource="{Binding Path=ServerItems, UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="CommandBehaviors:MouseDoubleClick.Command" Value="{Binding ConnectDb}"/>
<Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}"/>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Databases}">
<TextBlock Text="{Binding}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

来自 Style 标记的附加命令不起作用,而且它不应该起作用,因为已经有一个命令附加到 TreeView 标记级别。我想做的是为顶级子级执行一个命令,为低级子级执行另一个命令。我该怎么做?

编辑:

那么,正如 Viv 所建议的那样 - 如何检查 treeviewitem 是否是根节点?

最佳答案

类似于:

<Window.Resources>
<CommandBehaviors:IsRootNodeConverter x:Key="IsRootNodeConverter" />
</Window.Resources>
<Grid>
<TreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="CommandBehaviors:MouseDoubleClick.Command"
Value="{Binding ConnectDb}" />
<Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter"
Value="{Binding Path=SelectedItem,
RelativeSource={RelativeSource Self}}" />
<Setter Property="Foreground"
Value="Black" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=.,
RelativeSource={RelativeSource Self},
Converter={StaticResource IsRootNodeConverter}}"
Value="True">
<Setter Property="CommandBehaviors:MouseDoubleClick.Command"
Value="{Binding ConnectServer}" />
<Setter Property="Foreground"
Value="Tomato" />
</DataTrigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate>
<!--<TreeViewItem>-->
<TextBlock Text="{Binding}" />
<!--</TreeViewItem>-->
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeViewItem Header="1">
<TreeViewItem Header="A" />
<TreeViewItem Header="B">
<TreeViewItem Header="AA" />
<TreeViewItem Header="AB" />
<TreeViewItem Header="AC" />
</TreeViewItem>
<TreeViewItem Header="C" />
</TreeViewItem>
</TreeView>
</Grid>

和转换器:

class IsRootNodeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
TreeViewItem item = value as TreeViewItem;
if (item == null || item.Parent == null)
return false;
return !Object.ReferenceEquals(value.GetType(), item.Parent.GetType());
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotImplementedException();
}
}

我故意从 Style Trigger 中遗漏了 CommandBehaviors:MouseDoubleClick.CommandParameter 因为它似乎没有改变默认值。刚刚添加了一个用于测试的 Foreground 属性,您也可以删除它。

关于c# - 将命令附加到 TreeView 子项 - 嵌套子项不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com