2016-05-02 99 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:在服務程序是在視圖模型,以及所選擇的指數是一個屬性我道歉,不使這一明確。 –

相關問題