繁体   English   中英

将ListBox项目投射回其Collection类型

[英]Cast ListBox item back to its Collection type

在我的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方法中确定Parameter或CalcFile类型,但是我不知道该怎么做。 我得到演员表错误。

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

我实际上并不想将Parameter / CalcFile放入xaml.cs文件。 我宁愿将其与模型分开,而只是将其用作中介,以将双击事件传递给ViewModel。

哦,是的,我想我可以为不同的选项卡使用不同的事件处理程序,所以一个用于参数列表,一个用于CalcFile列表,这样我就可以拥有ParameterListBox_MouseDoubleClickCalcFileListBox_MouseDoubleClick ,然后在ViewModel中拥有两个不同的方法。

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

试试(发送者为ListBoxItem).DataContext

对于MVVM,

使用EventToCommand(interactivity),您可以从此处找到带有参数的invoke命令,

似乎发件人是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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM