无法在列表视图中重新选择单个项目

时间:2016-05-02 12:13:27

标签: c# wpf listview mvvm

我在WPVM中的MVVM / PRISM应用程序中有一个listview,它可能包含1对多元素。当listview只包含1个元素,并且我选择它时,即使我将SelectedIndedx值设置为-1,我也无法随后重新选择它。更糟糕的是,如果我使应用程序使用不同的单个元素更新列表视图,我也无法选择那个。当它是列表视图中唯一的项目时,我可以选择项目的唯一方法是让应用程序显示多个项目并选择除第一个项目之外的其他项目。然后,当我让应用程序显示包含单个项目的列表视图时,我可以再次选择它 - 但只能选择一次。

在我无法在列表视图中选择单个项目的情况下,服务程序永远不会触发。

我尝试使用“Listview.Container.Style”和IsSelected属性来实现我在这里找到的XAML建议,但这不起作用。

我的列表视图相当简单:

    <ListView Name="lstEditInstance"
          Grid.Row="5"
          ItemsSource="{Binding Path=InstanceList,Mode=TwoWay}"
          Width="488"
          FontFamily="Arial" FontSize="11"
          HorizontalAlignment="Left" VerticalAlignment="Stretch"    
          Margin="10,96,0,28"
          SelectedIndex="{Binding Path=InstanceSelectedIndex}">
    </ListView>

维修程序是:

    private void OnInstanceSelectedIndexChanged()
    {
      // Handle case where user hits Enter without making a selection:

      if (_instanceIndex == -1) return;

      // Get the instance record for the row the user clicked on as a
      // ResourceInstance class named "InstanceRecord".  

      InstanceRecord = _instanceList[_instanceIndex];

      _instanceNumber     = InstanceRecord.Instance;
      FormInstName        = InstanceRecord.InstName;
      FormInstEnabled     = InstanceRecord.Enabled;
      FormInstState       = InstanceRecord.InitialState;
      FormInstIPAddress   = InstanceRecord.IPAddress;
      FormInstPort        = InstanceRecord.Port.ToString();
      FormInstSelectedURL = InstanceRecord.UrlHandler;

    } // End of "OnResourceSelectedIndexChanged" method.

“InstanceList”是一个可观察的集合。

我很感激一些建议。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在MVVM场景中,我将使用包含所选项目的ViewModel:

class MyViewModel {

private IList<Item> instanceList= new List<Item>();

public IList<Item> List
{
    get {return list; }
    set {
        list = value;
        RaisePropertyChanged(() => List);
    }
}

private Item selectedItem;

public Item SelectedItem {
    get {return selectedItem;}
    set {
        selectedItem = value;
        RaisePropertyChanged(() => SelectedItem);
    }
}}

和XAML:

<ListView Name="lstEditInstance"
  Grid.Row="5"
  ItemsSource="{Binding Path=InstanceList}"
  Width="488"
  FontFamily="Arial" FontSize="11"
  HorizontalAlignment="Left" VerticalAlignment="Stretch"    
  Margin="10,96,0,28"
  SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}}">

请注意,除非必须修改列表项,否则不需要observableCollection,就像绑定应该是列表的默认绑定一样。 SelectedItem / SelectedIndex应该是TwoWay或Onewaytosource,后者如果您认为不需要以编程方式更改selectedItem 应该从ViewModel

调用服务例程

编辑:

您的服务例程代码应放在那里:

set {
    selectedItem = value;
    // your code
    RaisePropertyChanged(() => SelectedItem);
}

另一种有效的方法是在XAML上使用Blend,方法是在ViewModel下调用已更改索引和进程的命令。

为此,首先在项目和XAML添加中添加对System.Windows.Interactivity的引用  的xmlns:交互=“http://schemas.microsoft.com/expression/2010/interactivity

然后使用以下命令修改ListView:

<ListView Name="lstEditInstance"
Grid.Row="5"
ItemsSource="{Binding Path=InstanceList}"
Width="488"
FontFamily="Arial" FontSize="11"
HorizontalAlignment="Left" VerticalAlignment="Stretch"    
Margin="10,96,0,28"
SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}}">
<interactivity:Interaction.Triggers>
<interactivity:EventTrigger EventName="SelectionChanged">
  <interactivity:InvokeCommandAction Command="{Binding YourCommand}"
                         CommandParameter="{Binding YourCommandParameter}" />
</interactivity:EventTrigger>
</interactivity:Interaction.Triggers>