簡體   English   中英

綁定ListView.SelectedItem時遇到問題

[英]Trouble in binding ListView.SelectedItem

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

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++;
            });

Items是ObservableCollection

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

我看了很多類似的解決方案,但我不知道出了什么問題:(

首先,您還應該發布ItemsSource屬性的綁定代碼。

但主要問題是您沒有在設置器中調用PropertyChanged

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

            if(_selectedOne != value)
            _selectedOne = value;

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

為了使綁定工作,您必須從SelectedOne設置器中引發PropertyChanged事件。 定義SelectedOne屬性的類必須實現INotifyPropertyChanged

不管SelectedOne屬性的類型如何(即使它本身是ObservableObject),也必須在PropertyChanged 更改時引發PropertyChanged事件。

我同意克萊門斯和布萊德梅斯的看法。 唯一的事實是,SelectedOne必須與為集合設置的類相同。 對於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類已經以某種方式包含它。

問候,

凱文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM