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.
}