3

C#、WPF を使用し、MVVM を使用しようとしています。だから私は MyObjects の ObservableCollection を持っています。リストは DataGrid にレンダリングされ、MyObject の 1 つのプロパティは項目の静的リストで、各行の ComboBoxes に表示されます。

このコンボボックスの 1 つの行でアイテムを選択したいと思います。以前に別の行で選択されていた場合は、最後の選択をデフォルト値に削除する必要があります。どうすればこれを管理できますか? MyObjectViewModel は「独自の」コンボボックスの変更を認識していますが、最後に選択した ComboBox アイテムを別の MyObject オブジェクトから変更するように MainViewModel (MyObjects の ObservableCollection を保持する) にどのように指示できますか?

4

1 に答える 1

1

これを行う最善の方法は、バインディング フォーカスを ListCollectionViews に変更することです。これにより、カーソルを管理できるようになります。以下に例を示します。

ビューモデル

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;

    namespace BindingSample
    {
        public class ViewModel
        {
            private string[] _items = new[] { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

            public ViewModel()
            {
                List1 = new ListCollectionView(_items);
                List2 = new ListCollectionView(_items);
                List3 = new ListCollectionView(_items);

                List1.CurrentChanged += (sender, args) => SyncSelections(List1);
                List2.CurrentChanged += (sender, args) => SyncSelections(List2);
                List3.CurrentChanged += (sender, args) => SyncSelections(List3);
            }

            public ListCollectionView List1 { get; set; }

            public ListCollectionView List2 { get; set; }

            public ListCollectionView List3 { get; set; }

            private void SyncSelections(ListCollectionView activeSelection)
            {
                foreach (ListCollectionView view in new[] { List1, List2, List3 })
                {
                    if (view != activeSelection && view.CurrentItem == activeSelection.CurrentItem)
                        view.MoveCurrentTo(null);
                }
            }
        }
    }

意見

<Window x:Class="ContextMenuSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <ListBox ItemsSource="{Binding List1}" />
        <ListBox ItemsSource="{Binding List2}" />
        <ListBox ItemsSource="{Binding List3}" />        
    </StackPanel>
</Window>

これにより、アイテムを 1 つだけ選択できます。現時点ではハードコードされていますが、追加のリストに対してより柔軟に簡単に作成できます。

于 2012-05-23T11:02:01.563 に答える