麻烦结合ListView.SelectedItem

问题描述:

在我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

我同意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类已经包含它以某种方式。

问候,

凯文

第一,你也应该张贴代码为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 
     } 
    } 

调用的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