2

私のWPFmvvm(light)プロジェクトでは、このような問題があります:にバインドした後ListView.SelectedItemModelViewから変更しようとしています。問題ない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、別のに表示されます。その逆も同様です。

私は多くの同様の解決策を調べましたが、何が悪いのか理解できません:(

4

3 に答える 3

2

まず、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
        }
    }
于 2012-08-02T11:39:36.733 に答える
2

バインディングを機能させるには、セッターからPropertyChangedイベントを発生させる必要があります。プロパティSelectedOneを定義するクラスは、INotifyPropertyChangedを実装する必要があります。SelectedOne

プロパティのタイプに関係なくSelectedOne(それ自体がObservableObjectであっても)、プロパティのPropertyChangedが変更されたときにイベントを発生させる必要があります。

于 2012-08-02T11:40:02.223 に答える
1

私はクレメンスとブラインドメイスに同意します。唯一の事実は、SelectedOneはコレクションに設定されたものと同じクラスである必要があるということです。また、MVVM-lightライブラリでは、メソッドはOnPropertyChangedではなくRaisePropertyChangedです(viewModelがViewModelBaseから継承している場合)。

ソースにItemViewModelsが含まれている場合は、次のコードを使用する必要があります。

private ItemViewModel _selectedOne;

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

        if(_selectedOne != value)
        _selectedOne = value;

        RaisePropertyChanged("SelectedOne");
    }
}

コレクションにRaisePropertyChangedが必要ない理由は、ObsvervableCollectionクラスにすでに特定の方法でコレクションが含まれているためです。

よろしく、

ケビン

于 2012-08-02T12:47:52.467 に答える