Tengo un problema para obtener el valor (texto) del elemento seleccionado de ListView.

Además, no estoy usando MVVM, es el espacio de ejecución de PowerShell.

Aquí está el código XAML:

<Window x:Class="Post_Depl_App.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Post_Depl_App"
        mc:Ignorable="d"
        Title="Post_Depl_App" WindowState="Maximized" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Topmost="false" Background="#0060a9">
        <Window.Resources>
        <BooleanToVisibilityConverter x:Key="b2v" />
        
        <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=NumText, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=NumText}"/>
           </DataTrigger>
        </Style.Triggers>
        </Style>
        
    </Window.Resources>

<Grid>
    
 <ListView Name="SiteList" Height="530" Width="700" HorizontalAlignment="Center" Margin="0,350,0,100" Background="Transparent" BorderThickness="0" VerticalAlignment="Top" 
        Foreground="White" FontFamily="Segoe UI SemiLight" FontSize="20" 
        VirtualizingStackPanel.IsVirtualizing="True" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.CanContentScroll="False" ScrollViewer.IsDeferredScrollingEnabled="True"
        SelectedIndex="0">    
                <ListViewItem Content = "Australia"></ListViewItem>
                <ListViewItem Content = "Chile"></ListViewItem>
        </ListView>

Y aquí está el powershell donde tengo problemas. Probablemente encontrando la propiedad correcta:

$SiteCheck = $SyncHash.Window.Dispatcher.invoke([System.Func[String]{$SyncHash.SiteList.SelectedItem.ToString()})

        if($SiteCheck -eq "Australia"){
            (Get-Content -path C:\Post_Setup\temp.txt -Raw) -replace 'SiteVar','AU' | Set-Content -Path C:\Post_Setup\temp.txt
        }
        elseif($SiteCheck -eq "Chile"){
            (Get-Content -path C:\Post_Setup\temp.txt -Raw) -replace 'SiteVar','CL' | Set-Content -Path C:\Post_Setup\temp.txt
        }

Supongo que el problema radica en esta línea:

$SiteCheck = $SyncHash.Window.Dispatcher.invoke([System.Func[String]{$SyncHash.SiteList.SelectedItem.ToString()})

No funciona para ListView o ListBox. Sin embargo, esto funciona perfectamente para ComboBox:

$SiteCheck = $SyncHash.Window.Dispatcher.invoke([System.Func[String]{$SyncHash.SiteBox.Text})

¿Alguien sabe la mejor manera de obtener el valor del elemento seleccionado como texto de ListView / Box?

Gracias.

0
Oleg_D 3 mar. 2021 a las 20:29

1 respuesta

La mejor respuesta

En su caso, el tipo de SelectedItem es ListViewItem. Necesita obtener un valor de propiedad ListViewItem.Content.

Puede especificar SelectedValuePath que es la ruta (nombre de la propiedad) en SelectedItem utilizada para obtener el SelectedValue.

<ListView Name="SiteList" Height="530" Width="700" HorizontalAlignment="Center" Margin="0,350,0,100" Background="Transparent" BorderThickness="0" VerticalAlignment="Top" 
    Foreground="White" FontFamily="Segoe UI SemiLight" FontSize="20" 
    VirtualizingStackPanel.IsVirtualizing="True" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.CanContentScroll="False" ScrollViewer.IsDeferredScrollingEnabled="True"
    SelectedIndex="0" SelectedValuePath="Content">    
            <ListViewItem Content = "Australia"></ListViewItem>
            <ListViewItem Content = "Chile"></ListViewItem>
    </ListView>

Ahora SelectedValue contiene el valor de ListViewItem.Content, así que léalo en PowerShell.

$SiteCheck = $SyncHash.Window.Dispatcher.invoke([System.Func[String]{$SyncHash.SiteList.SelectedValue.ToString()})
1
user2250152 4 mar. 2021 a las 06:24