C# 在用户单击已选择的ListViewItem、MVVM时做出反应
我有一个类似这样的列表视图,它控制我的应用程序中打开的哪个选项卡C# 在用户单击已选择的ListViewItem、MVVM时做出反应,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个类似这样的列表视图,它控制我的应用程序中打开的哪个选项卡 <ListView Grid.ColumnSpan="2" Grid.Row="1" SelectedItem="{Binding Path=SelectedSubstanceName}" Name="listView" ItemsSource="{Binding Path=Substances}" HorizontalAlignment="Stretch" Margin="2" VerticalAlignment="Str
<ListView Grid.ColumnSpan="2" Grid.Row="1" SelectedItem="{Binding Path=SelectedSubstanceName}" Name="listView" ItemsSource="{Binding Path=Substances}" HorizontalAlignment="Stretch" Margin="2" VerticalAlignment="Stretch">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Lägg till" Command="{Binding AddSubstanceCommand}"/>
<MenuItem Header="Ta bort" Command="{Binding RemoveSubstanceCommand}"/>
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Name}" FontWeight="Bold" />
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我无法介绍的情况是,当用户单击“someSubstance”时,相应的选项卡打开,用户关闭,并且“someSubstance”仍然处于选中状态。如果用户想要再次打开它,他必须选择一些其他物质(随后将被打开),然后再次单击“someSubstance”。即使在单击同一ListViewItem时也可能触发该属性吗
我知道我可以在双击时添加一个事件,但理想情况下,我希望避免事件和双击。我认为问题在于,在第一次单击某个项目后,列表的
SelectedItem
被设置。第二次单击同一项目后,SelectedItem
不会更改,因为它已设置为该项目。处理单击后,您应该将SelectedItem
设置为null
。关闭选项卡后,尝试取消选择列表视图中的所有项目
YOURLISTVIEW.UnselectAll();
因此,下次有人选择一个项目时,会有一个变化。您实际上不想使用该类,而只是简单地使用,因为它是表示元素序列的最基本方式,但没有额外的内容,例如
SelectedItem
,SelectedValue
,从选择器
派生的任何类所具有的
从这里开始,问题只在于如何在ItemsControl
中表示每个项。您想要知道的行为是何时单击了特定项,这将使该类成为一个很好的候选对象,因为它通过ICommand
接口处理单击行为。显然,由于您一般都知道DataTemplate
s和样式,您应该已经知道可以自定义按钮的外观(视觉上),而不牺牲实际行为(单击处理)
public-ICommand选择substancecommand{get;private-set;}
私有void SelectSubstance(对象参数)
{
//在此处添加“单击”的物质,但您需要这样做。
}
请记住,我不知道您使用的是什么框架,所以我只给出了一个命令代码在视图模型中的一般示例。MVVM和使用WPFSawesomeUI的关键是始终考虑您想要的行为以及哪些控件提供该行为。忽略它们的实际外观,因为可以在不丢失该行为的情况下改变它们
YOURLISTVIEW.UnselectAll();
<ItemsControl ItemsSource="{Binding Path=Substances}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Style="{StaticResource SomeStyleToChangeItsLook}"
Command="{Binding Path=SelectSubstanceCommand}"
CommandParameter="{Binding}"
Content="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
public ICommand SelectSubstanceCommand { get; private set; }
private void SelectSubstance(object parameter)
{
// Add the substance that was "clicked" on here however you want to do it.
}