2012-08-02 87 views
1

在我WPF MVVM(光)的項目,我有這樣的問題:我ModelViewListView.SelectedItem結合後,我試圖把它從ModelView。它似乎是確定改變,但沒有happend在查看:麻煩結合ListView.SelectedItem

XAML:

<ListView SelectedItem="{Binding SelectedOne}" 
      ItemsSource="{Binding Items}"> 
</ListView> 

<ListView  ScrollViewer.CanContentScroll="False" 
       ItemsSource="{Binding Items}" 
       ItemTemplateSelector="{StaticResource myDataTemplateSelector}" 
       HorizontalContentAlignment="Stretch" 
       SelectedItem="{Binding SelectedOne, Mode=TwoWay}" 
       IsSynchronizedWithCurrentItem="True"> 
</ListView> 

MODELVIEW:

ObservableCollection<ItemViewModel> _EAItems = new ObservableCollection<ItemViewModel>(); 
public ObservableObject _selectedOne; 

public ObservableCollection<ItemViewModel> Items 
     { 
      get 
      { 
       return _EAItems; 
      } 
      set 
      { 
       _EAItems = value; 
      } 
     } 

public ObservableObject SelectedOne 
     { 
      get { return _selectedOne; } 
      set 
      { 

       if(_selectedOne != value) 
       _selectedOne = value; 

      } 
     } 
Select = new RelayCommand(() => 
      { 
       if (qw == 15) { qw = 0; }else 
       SelectedOne = Items[qw]; 
       qw++; 
      }); 

項目是ObservableCollection

我添加了另一個Listview並將其綁定到相同的來源。當我在Listview之一更改SelctedItem時,它顯示在另一個上,反之亦然。

我看了很多直通類似的解決方案,我想不出有什麼錯:(

+0

我無法找到一個參考,但我相信有一個隱含的屬性更改事件時的財產變化的來源是用戶界面 - 這就是爲什麼與示例2 ListViews正在工作 – 2012-08-02 12:29:26

+0

非常感謝大家,它的工作 – ISens 2012-08-02 12:59:54

回答

0

我同意Clemens和blindmeis。唯一的事實是SelectedOne需要與爲Collection設置的類相同。而對於MVVM-light庫,該方法是RaisePropertyChanged而不是OnPropertyChanged(如果您的viewModel繼承自ViewModelBase)。

如果源包含ItemViewModels應使用此代碼:

private ItemViewModel _selectedOne; 

public ItemViewModel SelectedOne 
{ 
    get { return _selectedOne; } 
    set 
    { 

     if(_selectedOne != value) 
     _selectedOne = value; 

     RaisePropertyChanged("SelectedOne"); 
    } 
} 

之所以您的收藏不需要RaisePropertyChanged是ObsvervableCollection類已經包含它以某種方式。

問候,

凱文

2

第一,你也應該張貼代碼爲ItemsSource時,ItemsSource屬性的綁定。

但主要的問題是你不要在你的二傳手

public ObservableObject SelectedOne 
    { 
     get { return _selectedOne; } 
     set 
     { 

      if(_selectedOne != value) 
      _selectedOne = value; 

      OnPropertyChanged("SelectedOne ");//<-- otherwise the view dont know that the SelectedItem changed 
     } 
    } 
2

調用的PropertyChanged爲了使綁定工作,你將不得不從SelectedOne制定者提出一個PropertyChanged事件。定義類財產將不得不執行INotifyPropertyChanged

不管SelectedOne屬性(即使它本身就是一個ObservableObject)的類型的,你必須提出一個PropertyChanged事件時的屬性更改

+0

SelectedObject的類型是ObservableObject,它已經繼承了PropertyChanged和PropertyChanging接口。它在MVVM-light庫中實現 – ISens 2012-08-02 11:50:09

+1

這不是重點。這裏無關緊要。 'SelectedOne'setter必須引發一個'PropertyChanged'事件。請參閱@blindmeis的答案中的示例代碼。 – Clemens 2012-08-02 12:08:20

+0

爲什麼比它的作品蒙山ListView的例子? – ISens 2012-08-02 12:13:35