在用户点击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。 我所做的是:
我为ListView定义了样式,我添加了border,scrollviewer和ItemsPresenter(代表ListViewItem的集合)。
然后我为ListViewItem定义了由Button,命令,样式触发器组成的样式。
最后,在UserControl / MainWindow中,我添加了ListView。
我已将ListView Style属性设置为已定义的ListView样式,并将其ItemContainerStyle属性设置为已定义的ListViewItem样式。
我没有设置或使用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>
答案 0 :(得分:0)
在ListBoxItem样式中将Focusable属性设置为false可能对您有所帮助:
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False" />
</Style>