【问题标题】:Cast ListBox item back to its Collection type将 ListBox 项转换回其 Collection 类型
【发布时间】:2016-12-13 04:08:48
【问题描述】:

在我的 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类型,但是不知道怎么做。我收到演员表错误。

看来sender是ListBoxItem,但是如何在ViewModel中将其转换为Parameter/CalcFile呢?

我实际上不想将 Parameter/CalcFile 带入 xaml.cs 文件。我希望将其与模型分开,并将其用作处理双击事件并将其传递给视图模型的中介。

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

【问题讨论】:

    标签: c# wpf xaml mvvm listbox


    【解决方案1】:

    看起来发送者是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);
            }
        }
    

    【讨论】:

      【解决方案2】:

      看来sender是ListBoxItem,但是如何在ViewModel中把它转换成Parameter/CalcFile呢?

      try (sender as ListBoxItem).DataContext

      对于 MVVM,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多