绑定ListView.SelectedItem时出现问题

时间:2012-08-02 10:53:03

标签: c# wpf data-binding mvvm

在我的WPF mvvm(light)项目中,我遇到了这样的问题:在ListView.SelectedItem绑定到ModelView之后,我正试图从ModelView更改它。它似乎没问题,但在View:

中没有任何事情发生

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并将其绑定到相同的来源。当我在SelctedItem之一中更改Listview时,它会显示在另一个上,反之亦然。

我看了很多类似的解决方案,我无法弄清楚出了什么问题:(

3 个答案:

答案 0 :(得分:2)

首先,您还应该发布ItemsSource的绑定代码,即ItemsSource属性。

但主要问题是你没有在你的setter中调用PropertyChanged

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

            if(_selectedOne != value)
            _selectedOne = value;

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

答案 1 :(得分:2)

为了进行绑定工作,您必须从SelectedOne setter中引发PropertyChanged事件。定义SelectedOne属性的类必须实现INotifyPropertyChanged

无论SelectedOne属性的类型(即使它本身是一个ObservableObject),当值<时,您必须引发PropertyChanged事件/ em>属性发生变化。

答案 2 :(得分:1)

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

此致

凯文