En mi XAML tengo dos pestañas, la primera contiene un ListBox enlazado a objetos ObservableCollection, llamado ParameterFilesList, y el segundo un ListBox enlazado a objetos ObservableCollection, llamado 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>

Cuando hago doble clic en un elemento, quiero abrir el archivo subyacente que muestra el nombre en la lista. Primero, necesito recuperar el elemento de la lista en el objeto Parameter / CalcFile.

Actualmente, manejo el doble clic en el código subyacente:

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

Entonces mi idea era determinar el tipo de parámetro o CalcFile en el método OpenOnDoubleClick de ViewModel, pero no sé cómo hacerlo. Recibo errores de transmisión.

Parece que el remitente es ListBoxItem, pero ¿cómo lo convierto en Parameter / CalcFile en ViewModel?

En realidad, no quiero traer el Parámetro / CalcFile al archivo xaml.cs. Preferiría mantener eso separado del modelo, y simplemente usarlo como intermediario para manejar y pasar el evento de doble clic al modelo de vista.

Oh, sí, y supongo que podría tener diferentes controladores de eventos para las diferentes pestañas, así que uno para la lista de parámetros y otro para la lista de CalcFile, de modo que tengo ParameterListBox_MouseDoubleClick y CalcFileListBox_MouseDoubleClick y luego dos métodos diferentes en ViewModel.

0
Igavshne 13 dic. 2016 a las 07:08

2 respuestas

La mejor respuesta

Parece que el remitente es ListBoxItem, pero ¿cómo lo convierto en Parameter / CalcFile en ViewModel?

Transmita el DataContext del elemento ListBox a su tipo. Algo como esto:

    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);
        }
    }
0
mm8 13 dic. 2016 a las 11:32

Parece que el remitente es ListBoxItem, pero ¿cómo lo convierto en Parameter / CalcFile en ViewModel?

Intente (remitente como ListBoxItem) .DataContext

Y para MVVM,

Use EventToCommand (interactividad) y puede encontrar el comando de invocación con parámetros de aquí,

0
Community 23 may. 2017 a las 11:53