C# 从 TreeView 获取 SelectedItem?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1238304/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get SelectedItem from TreeView?
提问by Joseph jun. Melettukunnel
Does anyone know how I can get the SelectedItem (not the Header) from a TreeView?
Here is my code:
有谁知道如何从 TreeView 获取 SelectedItem(不是标题)?
这是我的代码:
<TreeView Name="treeView1" DataContext="{Binding Path=PresentationsViewModel}" Grid.Column="1" >
<TreeViewItem IsExpanded="True" Header="Objects-A-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListA}"></TreeViewItem>
<TreeViewItem IsExpanded="True" Header="Objects-B-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListB}"></TreeViewItem>
<TreeViewItem IsExpanded="True" Header="Objects-C-List" DisplayMemberPath="Name" ItemsSource="{Binding Path=MyItem.ListC}"></TreeViewItem>
</TreeView>
Note that there are 3 different Lists, containing 3 different Object-Types. It'd help me a lot to have something like:
请注意,有 3 个不同的列表,包含 3 个不同的对象类型。拥有以下内容对我有很大帮助:
public Object SelectedObject
{
set { _selectedObject = value; RunMyMethod(); RaisePropertyChanged("SelectedObject"); }
}
采纳答案by Ingó Vals
Ok I know this is an old question and probably dead but as Charlie has it right. This is something that can also be used in code. You could do for example:
好的,我知道这是一个老问题,可能已经死了,但查理说得对。这也可以在代码中使用。你可以做例如:
<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" />
Which will show the selected item. You can add a style or DataTemplate to that or use a default DataTemplate to the object you are trying to show.
这将显示所选项目。您可以向其中添加样式或 DataTemplate,或者对您尝试显示的对象使用默认 DataTemplate。
回答by Charlie
Maybe I've misunderstood your question but,
也许我误解了你的问题,但是,
treeView1.SelectedItem
Should work.
应该管用。
回答by Diego Torres
Step 1Install the NuGet: Install-Package System.Windows.Interactivity.WPF
第 1 步安装 NuGet:Install-Package System.Windows.Interactivity.WPF
Step 2In your Window tag add: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
第 2 步在您的 Window 标签中添加:xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Step 3In the TreeView add:
第 3 步在 TreeView 中添加:
<TreeView Name="treeView1" ... >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding SelectedItemChangedCommand}" CommandParameter="{Binding ElementName=treeView1, Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
</TreeView>
Step 4In your ViewModel add:
第 4 步在您的 ViewModel 添加:
private ICommand _selectedItemChangedCommand;
public ICommand SelectedItemChangedCommand
{
get
{
if (_selectedItemChangedCommand == null)
_selectedItemChangedCommand = new RelayCommand(args => SelectedItemChanged(args));
return _selectedItemChangedCommand;
}
}
private void SelectedItemChanged(object args)
{
//Cast your object
}
回答by kykzk46
Diego Torres's answeris clean and simple! But for those who don't want to install a NuGet Package just for this purpose, you can create your own dependency property that Execute Command when a even is fired.
迭戈·托雷斯(Diego Torres)的回答简洁明了!但是对于那些不想为此目的安装 NuGet 包的人,您可以创建自己的依赖属性,即在触发 even 时执行命令。
namespace View.Helper
{
public class EventToCommandAdaptor
{
public static readonly DependencyProperty TreeViewSelectedItemChangedCommand_DpProp =
DependencyProperty.RegisterAttached(
"TreeViewSelectedItemChangedCommand",
typeof(ICommand),
typeof(EventToCommandAdaptor), // owner type
new PropertyMetadata(new PropertyChangedCallback(AttachOrRemoveTreeViewSelectedItemChangedEvent))
);
public static ICommand GetTreeViewSelectedItemChangedCommand(DependencyObject obj)
{
return (ICommand)obj.GetValue(TreeViewSelectedItemChangedCommand_DpProp);
}
public static void SetTreeViewSelectedItemChangedCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(TreeViewSelectedItemChangedCommand_DpProp, value);
}
public static void AttachOrRemoveTreeViewSelectedItemChangedEvent(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
TreeView treeview = obj as TreeView;
if (treeview != null)
{
ICommand cmd = (ICommand)args.NewValue;
if (args.OldValue == null && args.NewValue != null)
{
treeview.SelectedItemChanged += ExecuteTreeViewSelectedItemChanged;
}
else if (args.OldValue != null && args.NewValue == null)
{
treeview.SelectedItemChanged -= ExecuteTreeViewSelectedItemChanged;
}
}
}
private static void ExecuteTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> args)
{
DependencyObject obj = sender as DependencyObject;
ICommand cmd = (ICommand)obj.GetValue(TreeViewSelectedItemChangedCommand_DpProp);
if (cmd != null)
{
if (cmd.CanExecute(args.NewValue))
{
cmd.Execute(args.NewValue);
}
}
}
}
}
Include xmlns:vh="clr-namespace:View.Helper"
in <Windows></Windows>
包括xmlns:vh="clr-namespace:View.Helper"
在<Windows></Windows>
And the TreeView looks like:
TreeView 看起来像:
<TreeView ItemsSource="{Binding MyItemSource}"
vh:EventToCommandAdaptor.TreeViewSelectedItemChangedCommand="{Binding MyCommand}">
</TreeView>
I learnt this trick when I encountered a similar situation: I want to execute a command when DataGrid.MouseDoubleClick Event is fired. But sorry that I forgot to mark down the source.
我在遇到类似情况时学会了这个技巧:我想在触发 DataGrid.MouseDoubleClick 事件时执行命令。但是很抱歉我忘记标记来源。