gpt4 book ai didi

c# - 嵌套列表框如何在子列表框鼠标双击上设置父列表框selectedItem

转载 作者:太空狗 更新时间:2023-10-29 20:39:29 43 4
gpt4 key购买 nike

我有一个嵌套的 ListBox。在内部列表框鼠标双击事件中,我需要根据某些逻辑打开一个新窗口,为此我需要内部 ListBox SelectedItem 及其相应的外部 ListBox SelectedItem。如何以 MVVM 方式获取它?

<ListBox ItemsSource="{Binding OuterCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding OuterProperty1}" />
<ListBox Width="200" ItemsSource="{Binding InnerCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding InnerProperty1}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

要记住的事情:

1) 内集合和外集合项之间没有关系。

2) 我正在使用 MVVMLight 工具包,作为一个临时解决方案,我只是将内部 ListBox 鼠标双击事件参数传递给 View 模型并遍历树以找到外部 ListBox 项。我知道这违反了 MVVM 规则,那么我怎样才能以正确的 MVVM 方式做到这一点?

最佳答案

找到一个可能的解决方案

您可以在 ListBox 上使用 SelectedItem 属性。

这是我用来解决你问题的代码。虽然我用的是Cinch,但是轻框架应该没有问题

主窗口.xaml

<Window x:Class="TestWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Title="MainWindow" Height="350" Width="525">
<ListBox ItemsSource="{Binding OuterCollection}" SelectedItem="{Binding OuterListBoxSelectedItem}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" />
<ListBox Width="150" DataContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
ItemsSource="{Binding InnerCollection}"
SelectedItem="{Binding InnerListBoxSelectedItem}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding TestCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}, AncestorLevel=2},Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>

主窗口.xaml.cs

using System.Windows;

namespace TestWPF
{

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
}

最后但同样重要的是我的模型

using System.Collections.ObjectModel;
using System.Windows.Input;
using Cinch;

namespace TestWPF
{
public class ViewModel : ViewModelBase
{
public ICommand TestCommand { get; private set; }
public ObservableCollection<string> OuterCollection { get; private set; }
public string OuterListBoxSelectedItem { get; set; }
public ObservableCollection<string> InnerCollection { get; private set; }
public string InnerListBoxSelectedItem { get; set; }

public ViewModel()
{
OuterCollection = new ObservableCollection<string> { "Outer 1", "Outer 2", "Outer 3", "Outer 4" };
InnerCollection = new ObservableCollection<string> { "Inner 1", "Inner 2", "Inner 3" };
TestCommand = new SimpleCommand<object, object>(Test);
NotifyPropertyChanged("OuterCollection");
NotifyPropertyChanged("InnerCollection");
NotifyPropertyChanged("TestCommand");
}
public void Test(object o)
{
var a = InnerListBoxSelectedItem;
var b = OuterListBoxSelectedItem;
"".ToString();
}
}
}

我还需要再添加一个对 System.Windows.Interactivity 的引用

希望对你有帮助

关于c# - 嵌套列表框如何在子列表框鼠标双击上设置父列表框selectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20208921/

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