2

ObservableCollectionにバインドされているこのListBoxがあります。リスト内の各オブジェクトは、ISelectableと呼ばれるインターフェイスを実装します

public interface ISelectable : INotifyPropertyChanged
{
    event EventHandler IsSelected;
    bool Selected { get; set; }
    string DisplayText { get; }
}

どのオブジェクトがどのように選択されているかに関係なく、どのオブジェクトが選択されているかを追跡したいと思います。ユーザーはリストボックス内のオブジェクトの表現をクリックできますが、コードを介してオブジェクトが選択されている可能性もあります。ユーザーがリストボックスを介してオブジェクトを選択した場合、選択したアイテムをISelectableにキャストし、Selectedプロパティをtrueに設定します。

ISelectable selectable = (ISelectable)e.AddedItems[0];
selectable.Selected = true;

私の問題は、コードを使用してオブジェクトを選択すると、選択したアイテムを変更するためのListBoxを取得できないことです。DataTemplateを使用して、選択したオブジェクトを別の色で表示しています。これは、すべてが正しく表示されることを意味します。ただし、ListBoxには、ユーザーが最後にクリックしたオブジェクトがSelectedItemとして含まれています。つまり、リスト内の別のオブジェクトを最初に選択しないと、アイテムをクリックできません。

誰かがこれを解決する方法について何か考えを持っていますか?マウスイベントとキーボードイベントを処理するカスタムコードを作成することで、私が望むことを達成できると確信していますが、そうではありません。SelectedItemプロパティをコレクションに追加し、それをListBoxのSelectItemPropertyにバインドしようとしましたが、うまくいきませんでした。

4

3 に答える 3

4

ListBoxItem.IsSelectedをSelectedプロパティにデータバインディングすることで、これを実現することもできます。アイデアは、作成時に各ListBoxItemのバインディングを設定することです。これは、ListBox用に生成された各ListBoxItemを対象とするスタイルを使用して実行できます。

このように、リストボックス内のアイテムが選択/選択解除されると、対応するSelectedプロパティが更新されます。同様に、コードでSelectedプロパティを設定すると、リストボックスに反映されます

これを機能させるには、SelectedプロパティでPropertyChangedイベントを発生させる必要があります。

<List.Resources>
    <Style TargetType="ListBoxItem">
        <Setter 
            Property="IsSelected" 
            Value="{Binding 
                        Path=DataContext.Selected, 
                        RelativeSource={RelativeSource Self}}" 
            />
    </Style>
</List.Resources>
于 2008-11-06T21:04:51.603 に答える
1

リストボックスのSelectedItemChangedイベントとSelectedIndexChangedイベントを見ましたか?

これらは、選択方法に関係なく、選択が変更されるたびにトリガーする必要があります。

于 2008-11-06T13:32:58.117 に答える
0

選択が変更されたときに propertyChanged イベントを発生させる必要があると思います。ISelectable を実装するオブジェクトにこのコードを追加します。次のような結果になります。

private bool _Selected;
        public bool Selected
        {
            get
            {
                return _Selected;
            }
            set
            {
                if (PropertyChanged != null)                
                    PropertyChanged(this, new PropertyChangedEventArgs("Selected"));

                _Selected = value;
            }
        }

次のコードを試しました:

public ObservableCollection<testClass> tests = new ObservableCollection<testClass>();

        public Window1()
        {
            InitializeComponent();
            tests.Add(new testClass("Row 1"));
            tests.Add(new testClass("Row 2"));
            tests.Add(new testClass("Row 3"));
            tests.Add(new testClass("Row 4"));
            tests.Add(new testClass("Row 5"));
            tests.Add(new testClass("Row 6"));
            TheList.ItemsSource = tests;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            tests[3].Selected = true;
            TheList.SelectedItem = tests[3];
        }

ここで、testClass は ISelectable を実装します。

これはxamlの一部であり、空想的なものではありません:

<ListBox Grid.Row="0" x:Name="TheList"></ListBox>        
<Button Grid.Row="1" Click="Button_Click">Select 4th</Button>

これが役立つことを願っています。

于 2008-11-06T15:24:03.647 に答える