如何从数据模板WPF获取列表视图选择更改事件

时间:2017-05-31 15:38:33

标签: c# wpf events command

列表视图点击与数据模板中的列表视图不一致。我在列表视图中添加了一个事件设置器,因为我想使用列表视图中的选择更改事件来获取列表视图中的选定项并将其传递给另一个要处理的函数。我暂时使用消息框而不是测试功能。但是当我选择一个项目时,事件只会触发一段时间,我会每5秒钟进行一次轮询,以更新我的列表。

C#:

    private void ListViewItem_PreviewMouseLeftButtonOtherMatchDown(object sender, MouseButtonEventArgs e)
    {
        var item = sender as ListViewItem;
        if (item != null && item.IsSelected)
        {
            Xceed.Wpf.Toolkit.MessageBox.Show("Test Event");
        }
    }

XAML

<DataTemplate>
    <StackPanel Orientation="Vertical">
        <ListView  x:Name="lvExport"  ItemsSource="{Binding festItems}" SelectedItem="{Binding Selectedfest, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" >
            <ListView.View>
                <GridView>
                    <GridViewColumn x:Name="test" Header="Data"  >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="20*" />
                                        <ColumnDefinition Width="20*" />
                                        <ColumnDefinition Width="20*" />
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="20*" />
                                    </Grid.RowDefinitions>
                                    <Image Width="75"  HorizontalAlignment="Left" Source="Images/document.png"  Grid.Column="0"/>
                                    <StackPanel Orientation="Vertical" Grid.Column="1" Grid.ColumnSpan="2">
                                        <StackPanel Orientation="Horizontal" >
                                            <TextBlock  Text="Display Name" HorizontalAlignment="Left"     ></TextBlock>
                                            <TextBlock  Text="Twitter Handle"  Grid.ColumnSpan="2" Margin="50,0,0,0"/>
                                        </StackPanel >
                                        <TextBlock Text="testdata" Height="80"></TextBlock>
                                        <Image Source="Images/document.png" Grid.Column="1" Grid.Row="1"  Grid.ColumnSpan="2" Height="79"></Image>
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem" >
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonOtherMatchDown" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </StackPanel>
</DataTemplate>

型号:

class festViewModel : ToolViewModel
{
    public festItem _selectedfest;
    public festItem Selectedfest
    {
        get { return _selectedfest; }
        set
        {
            if (_selectedfest != value)
            {
                _selectedfest = value;
                RaisePropertyChanged("Selectedfest");

            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,我建议您创建一个userControl,并将所有内容放入其中。 下一步创建一个模型类,它将保存您的Fest项目。 将listview的ItemsSource设置为Fest的集合。 将SelectedItem设置为Fest类型 我注意到你可能正在编写文件后面的代码。充分利用MVVM,并将其添加到listView

        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding SelectionChangeCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

在视图模型中,声明ICommand类型的属性SelectionChangeCommand。 然后在SelectionChanged方法中,您只需获取SelectedItem。 请注意,如果您要每隔几秒进行一次轮询,为了不锁定UI,请考虑使用Dispatcher.Invoke。