2013-10-02 59 views
0

我正在使用WPF中的ListView(MAHApps樣式的ListView)。我將ListView綁定到一個可觀察的集合。我將SelectedItem-Property綁定到ViewModel的一個屬性。WPF ListView忽略SelectedItem-change

當我通過GUI選擇ListView中的一個項目時,「SelectedItem」已更改。當我更改ViewModel中的「SelectedItem」時,ListView只會更改,當我將SelectedItem設置爲NULL時。當我設置任何其他(有效!)對象(如ObservableCollection的第一個條目)時,ListView會忽略它。 此外:當我想「選擇」SelectedItem更改(因爲數據未保存),ListView突出顯示新的選定的項目,而不是ViewModel的SelectedItem-Property。

我已經嘗試過改變結合「模式=雙向」 - 不工作,以及(否則的SelectedItem的「NULL」變化是行不通的爲好)

這是代碼從觀點:

<ListView ItemsSource="{Binding Configurations}" SelectedItem="{Binding SelectedUserConfiguration}" SelectionMode="Single"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="User Configuration" DisplayMemberBinding="{Binding ConfigurationName}" Width="200" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

我的視圖模型:

public ObservableCollection<UserConfigurationViewModel> Configurations { get; private set; } 
private UserConfigurationViewModel _selectedUserConfiguration; 
public UserConfigurationViewModel SelectedUserConfiguration 
{ 
    get { 
    return this._selectedUserConfiguration; 
    } 
    set 
    { 
     if (this._selectedUserConfiguration != null && this._selectedUserConfiguration.WasChanged) 
     { 
     if (ask-user) 
     { 
      this._selectedUserConfiguration.Reset(); 
      this._selectedUserConfiguration = value; 
     } 
     } 
     else 
     { 
     this._selectedUserConfiguration = value; 
     } 
     NotifyOfPropertyChange(() => this.SelectedUserConfiguration); 
    } 
    } 

而且這裏有一個例子 - 這就是所謂的構造函數。試圖執行一個測試按鈕,選擇最後一個,第一和任何項目 - 沒有工作...

if (this.Configurations.Count > 0) 
{ 
    this.SelectedUserConfiguration = this.Configurations.First(); 
} 

感謝您的幫助! 霍爾格

+0

我只是猜測,可能的問題是ListView控件的'SelectedItem'屬性的類型是object'和你'SelectedUserConfiguration'屬性的類型'UserConfigurationViewModel'的'? – Dante

+0

你如何解決這個問題? – artos

回答

1

爲了在從代碼的任何收集控制以選擇所選擇的項目,所選擇的項目必須是從被綁定到ItemsSource屬性集合中實際零件。

SelectedUserConfiguration = Configurations.Where(c => c.UniqueProperty == 
    valueOfItemToSelect).FirstOrDefault(); 

如果你的數據類型的對象不具有獨特的屬性,你可以簡單地添加一個int Id屬性用於此目的:可以,如果你的藏品至少有一個獨特的屬性與LinQ很輕鬆地實現。

0

我只是與TabControl有同樣的問題。
我試着創建一個int屬性並將其綁定到SelectedIndex,但沒有成功。

奇怪的是這並獲得成功:

在你的ListView設置IsSynchronizedWithCurrentItem="True"
設置一個ListView.Resources這樣的:

<ListView.Resources> 
    <Style TargetType="ListViewItem" x:Key="ListViewTemplate"> 
       <Setter Property="IsSelected" Value="True" /> 
     </Style> 
    </ListView.Resources> 

祝你好運!