0

私はコンボボックスとラベルを持っています:

<!-- Does not select appropriate value after moving back to current item in collection -->
        <ComboBox
            ItemsSource="{Binding Path=Items}"
            SelectedValue="{Binding Path=SelectedItem, Mode=TwoWay}"
            DisplayMemberPath="ItemName" 
            Margin="8,2,8,16" />

<!-- Displays correctly after moving back to current item in collection -->
        <Label 
        Content="{Binding Path=SelectedItem.ItemName}"/>

コンボボックスでアイテムを設定できますが、監視可能なコレクションの現在のアイテムに移動したり戻ったりすると、コンボボックスでSelectedValueが期待どおりに設定されません(空のままです)-ラベルのコンテンツが正しく設定されています-そしてそれは同じものにバインドされています。

私は何が間違っているのですか?

どんな助けでも大歓迎です。

ジョー

4

1 に答える 1

0

ここで説明したようにを使用してみてくださいICollectionView回答)。CollectionViewがコンボボックスを処理し、現在のアイテムを読み取って設定できます。CurrentChangedICollectionViewからイベントにイベントハンドラーをアタッチするだけです。

XAML:

<ComboBox
      ItemsSource="{Binding Path=Items}"
      DisplayMemberPath="ItemName" 
      IsSynchronizedWithCurrentItem="True" 
      Margin="8,2,8,16" />

<Label Content="{Binding Path=CurrentItem.ItemName}"/>

ViewModel:

public class ViewModel :INotifyPropertyChanged
{
    private ObservableCollection<Item> _items= new ObservableCollection<Item>();
    private Item _currentItem;

    public ObservableCollection<Item> Items
    {
        get { return _items; }
        set { _items= value; OnPropertyChanged("Items");}
    }

    public Item CurrentItem
    {
        get { return _currentItem; }
        set { _currentItem = value; OnPropertyChanged("CurrentItem");}
    }

    public ICollectionView ItemsView { get; private set; }

    public ViewModel()
    {
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 1"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 2"});
        Items.Add(new Item{Id = Guid.NewGuid(), Name = "Item 3"});

        ItemsView = CollectionViewSource.GetDefaultView(Items);
        ItemsView .CurrentChanged += OnItemsChanged;
        ItemsView .MoveCurrentToFirst();
    }

    private void OnItemsChanged(object sender, EventArgs e)
    {
        var selectedItem = ItemsView .CurrentItem as Item;
        if (selectedItem == null) return;

        CurrentItem= selectedItem ;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Item
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}
于 2012-10-31T13:28:08.297 に答える