2016-05-02 64 views
0

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

在那些我无法在列表视图中选择单个项目的情况下,服务例程从不触发。

我试着实现一个XAML建议,我在这里使用“Listview.Container.Style”和IsSelected属性,但没有奏效。

我的列表视图是相当简单:

<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” 是一个观察的集合。

我很感激一些建议。预先感谢您的帮助。

回答

0

在MVVM的情况下,我会使用一个包含选定的项目,而不是一个视图模型:

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的应该是双向或Onewaytosource,后者如果你认为你不需要改变将selectedItem编程 服务程序应该从视图模型被称为

编辑:

你的代码服务程序应放置有:

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

另一个有效的方法是使用混合上XAML,通过在视图模型下改变的索引和过程调用的命令。

要做到这一点,首先在你的项目中添加引用System.Windows.Interactivity和XAML添加 的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> 

+0

要user3042207:在服务程序是在视图模型,以及所选择的指数是一个属性我道歉,不使这一明确。 –

相关问题