如何在选择ListView项后删除ListView选择

时间:2017-10-27 13:36:37

标签: c# wpf xaml mvvm

在用户点击ListViewItem后,我们可以设置ListView不保留选择吗? 它可能已经完成了吗?

注意:它不是要改变'IsSelected'上的样式,而是在用户点击它之后没有选择。

我尝试了以下但是没有成功。 在视图中:

<ListView Grid.Row="1" 
          ItemsSource="{Binding Models}" 
          SelectedItem="{Binding SelectedModel}"
          DisplayMemberPath="DisplayContent"/>

在具有View DataContext的ViewModel中:

public LookupItemWrapper SelectedModel
{
    get { return _selectionModel; }
    set
    {
        _selectionModel = value;

        OnPropertyChanged();

        if (value != null)
        {
            _eventAggregator.GetEvent<OnRequisitionSelectionInRequisitionProjectNavigationEvent>().Publish(   
                new OnRequisitionSelectionInRequisitionProjectNavigationEventArgs
                {
                    Requisitionid = _selectionModel.Id
                });
        }

        _selectionModel = null;

        OnPropertyChanged();
    }
}

我想我知道通过将ItemsControl与Button作为项目来模仿它的方法。 但是我真的很想知道我是否可以使用ListView执行此操作。

更新

我写了以下事件处理程序wrt Clemens&amp; Ed Plunkett的建议。但是我在哪里放置代码?我不应该将它放在VM构造函数中,因为每次将SelectedModel设置为null时,此事件处理程序逻辑也是如此。

SelectedModel.PropertyChanged += (s, e) =>
{
    if (SelectedModel != null)
    {
        ((ListView)s).SelectedItem = null;
    }
};

以答案更新

我尝试使用ItemsControl。 我写了ItemsControl的ItemTemplate,它有一个Button,用鼠标点击命令绑定。这个工作正常。 我还编写了ItemsControl的ItemTemplate,我打算定义它的样式,但是ItemContainerStyle只能具有ContentPresenter的TargetType。意思是我无法在样式中添加Border,ScrollViewer,Grid或任何其他UI元素。当然,我可以直接在UserControl / MainWindow上编写它,如下所示:

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <Border BorderBrush="Black" BorderThickness="10">
        <ItemsControl Grid.Column="0" 
                        ItemsSource="{Binding Friends}"
                        ItemContainerStyle="{StaticResource ItemContainerStyle}"
                        ItemTemplate="{StaticResource ItemTemplate}"/>
    </Border>
</ScrollViewer>

我发现ItemsControl是原始的而不是elegent。

所以我回到ListView。 我所做的是:

  1. 我为ListView定义了样式,我添加了border,scrollviewer和ItemsPresenter(代表ListViewItem的集合)。

  2. 然后我为ListViewItem定义了由Button,命令,样式触发器组成的样式。

  3. 最后,在UserControl / MainWindow中,我添加了ListView。

  4. 我已将ListView Style属性设置为已定义的ListView样式,并将其ItemContainerStyle属性设置为已定义的ListViewItem样式。

  5. 我没有设置或使用ListView SelectedItem属性。

    我响应用户点击而不是通过监视属性绑定到SelectedItem,而不是通过处理按钮命令绑定。

    这更容易也更优雅。

    <ListView Grid.Row="1" 
                ItemsSource="{Binding Models}" 
                ItemContainerStyle="{StaticResource RequisitionNavigationItemListViewItemStyle}" 
                Style="{StaticResource RequisitionNavigationListViewStyle}"/>
    

    以下是两种样式定义:

    <Style x:Key="RequisitionNavigationItemListViewItemStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="Background" Value="{StaticResource ViewListBackgroundBrush}"/>
        <Setter Property="Foreground" Value="{StaticResource ViewListForegroundBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Button Content="{Binding DisplayContent}"
                            Command="{Binding DataContext.OnSelectingRequisitionCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                            CommandParameter="{Binding}">
                        <Button.Template>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <Grid x:Name="grid">
                                    <Border x:Name="BorderInButton" Background="{StaticResource RequisitionNavigationBackgroundBrush}"  Height="65" SnapsToDevicePixels="True">
                                        <ContentPresenter x:Name="ContentPresenterInButton" TextBlock.Foreground="{StaticResource RequisitionNavigationForegroundBrush}">
                                            <ContentPresenter.Resources>
                                                <Style TargetType="{x:Type TextBlock}">
                                                    <Setter Property="TextWrapping" Value="Wrap"/>
                                                    <Setter Property="FontSize" Value="12"/>
                                                    <Setter Property="Margin" Value="10"/>
                                                </Style>
                                            </ContentPresenter.Resources>
                                        </ContentPresenter>
                                    </Border>
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter TargetName="BorderInButton" Property="Background" Value="{StaticResource RequisitionNavigationBackgroundHighlightedBrush}"/>
                                        <Setter TargetName="ContentPresenterInButton" Property="TextBlock.Foreground" Value="{StaticResource RequisitionNavigationForegroundHighlightedBrush}"/>
                                        <Setter Property="Cursor" Value="Hand"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Button.Template>
                    </Button>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
    <Style x:Key="RequisitionNavigationListViewStyle" TargetType="{x:Type ListView}">
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListView}">
                    <Border x:Name="Bd" BorderBrush="{StaticResource ViewListBorderBrush}" BorderThickness="2 1 4 4" Background="{StaticResource ViewListBackgroundBrush}" Padding="0" SnapsToDevicePixels="True">
                        <ScrollViewer Style="{StaticResource ScrollViewerStyle}">
                            <ItemsPresenter/>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

1 个答案:

答案 0 :(得分:0)

在ListBoxItem样式中将Focusable属性设置为false可能对您有所帮助:

<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <Setter Property="Focusable" Value="False" />
</Style>