我有一个嵌套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 Toolkit,作为临时解决方案,我只是将内部ListBox Mouse Double Click事件参数传递给View模型,并遍历树以查找Outer ListBox项。 我知道这是违反MVVM规则的,所以我怎么能以适当的MVVM方式来做呢?
答案 0 :(得分:1)
有一个可能的解决方案
您可以在SelectedItem
上使用属性ListBox
属性。
以下是我用来解决问题的代码。虽然我使用了Cinch,但它不应该是轻型框架的问题
MainWindow.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>
MainWindow.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
我希望这会有所帮助