将ListBox项目转换回其Collection类型

时间:2016-12-13 04:08:48

标签: c# wpf xaml mvvm listbox

在我的XAML中,我有两个选项卡,第一个包含一个绑定到ObservableCollection对象的ListBox,名为ParameterFilesList,第二个包含一个绑定到ObservableCollection对象的ListBox,名为CalcFilesList。

    <UserControl x:Class="Sym.VisualStudioExtension.Engines.TAEngineView"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:behaviours="clr-namespace:Sym.VisualStudioExtension"
     xmlns:local="clr-namespace:Sym.VisualStudioExtension"
     local:ViewModelLocator.AutoWireViewModel="True"
     mc:Ignorable="d" 
     d:DesignHeight="700" d:DesignWidth="400">
<Grid>
<TabControl x:Name="tabControl" HorizontalAlignment="Left" Height="490" Margin="19,44,-36,-234" VerticalAlignment="Top" Width="317">
    <TabItem Header="Parameter Files">
        <ListBox Margin="20" ItemsSource="{Binding ParameterFilesList}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>                    
        </ListBox>
    </TabItem>
    <TabItem Header="Calc Files">
        <ListBox Margin="20" ItemsSource="{Binding CalcFilesList}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>                   
        </ListBox>
    </TabItem>
</TabControl>
<Label x:Name="label" Content="{Binding Path=Title}" HorizontalAlignment="Left" Margin="19,13,0,0" VerticalAlignment="Top" Width="367
       " BorderThickness="2"/>

</Grid>

当我双击某个项目时,我想打开列表中名称显示的基础文件。首先,我需要将列表项返回到Parameter / CalcFile对象。

目前,我处理了代码隐藏中的双击:

private void ListBox_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        dynamic viewModel = DataContext;
        viewModel.OpenOnDoubleClick(sender, e);
    }   

然后我的想法是在ViewModel的OpenOnDoubleClick方法中确定参数或CalcFile类型,但我不知道该怎么做。我得到了投射错误。

似乎发件人是ListBoxItem,但如何将其转换为ViewModel中的Parameter / CalcFile?

我实际上并不想将Parameter / CalcFile带入xaml.cs文件。我宁愿将其与模型分开,只需将其用作中介来处理并将双击事件传递给viewmodel。

哦,是的,我想我可以为不同的标签设置不同的事件处理程序,因此一个用于参数列表,一个用于CalcFile列表,因此我有ParameterListBox_MouseDoubleClickCalcFileListBox_MouseDoubleClick然后ViewModel中的两种不同方法。

2 个答案:

答案 0 :(得分:0)

似乎发件人是ListBoxItem,但如何将其转换为ViewModel中的Parameter / CalcFile?

尝试(发件人为ListBoxItem).DataContext

和MVVM,

使用EventToCommand(interactive),你可以找到带有here参数的invoke命令,

答案 1 :(得分:0)

  

似乎发件人是ListBoxItem,但是如何将它转换为ViewModel中的Parameter / CalcFile?

将ListBox项的DataContext转换为您的类型。像这样:

    private void ListBox_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        ListBoxItem lbi = sender as ListBoxItem;
        CalcFile clickedCalcFile = lbi.DataContext as CalcFile;
        if(clickedCalcFile != null)
        {
            var viewModel = DataContext as YourViewModelType;
            viewModel.OpenOnDoubleClick(clickedCalcFile);
        }
    }