【问题标题】:How to get a list view selection changed event from a data template WPF如何从数据模板 WPF 中获取列表视图选择更改事件
【发布时间】:2017-11-01 12:18:21
【问题描述】:

列表视图点击与我在数据模板中的列表视图不一致。我在列表视图中添加了一个事件设置器,因为我想使用列表视图的选择更改事件来获取列表视图的选定项目并将其传递给另一个要处理的函数。我暂时使用消息框而不是测试功能。但是当我选择一个项目时,该事件只会触发一段时间,我会每 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");

            }
        }
    }
}

【问题讨论】:

  • 我必须单击一个项目两次才能显示消息框

标签: c# wpf events command


【解决方案1】:

首先,我建议您创建一个 userControl,并将所有内容放入其中。 接下来创建一个模型类来保存你的 Fest 项目。 将列表视图的 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。

【讨论】:

  • 当您说创建用户控件时,您的意思是让我使用代码来创建列表框吗?或者你的意思是什么?对于调度员,我已经将它用于轮询/我是否也将它用于选择更改或我将在选择更改中调用的函数?
  • 是的。在 add new item --> WPF 下创建一个用户控件,用户控件 (WPF) 这将创建一个空的用户控件。将您的 xaml 粘贴到其中。不太明白为什么需要使用轮询来每 5 秒更新一次列表。如果您在视图模型中实现 INotifyPropertyChanged,任何更改都会生效。
  • 谢谢!我将检查用户控件。轮询的作用是检查我的 json 文件是否已更新,并将其传递给我的视图模型中的对象集合。我可以在不进行轮询的情况下从 url 检查更新吗?
  • 从技术上讲,这不是 wpf 问题,这取决于您要检查的 url。包含 url 的相关网站可能有一些 API 或 RSS Feed 等。
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多