11

次の問題があります: 2 つListBoxの があり、2 つの異なるがありますが、これら 2 つのリスト間で単一の選択を実行しようとしてItemSourceいたため、両方とも に対して同じbindingです。SelectedItem

問題をよりよく示す画像を次に示します。

赤で最初のリスト。 黒の 2 番目のリスト。

私は何をしたいですか?最初のリスト (赤) から 1 つのアイテムを選択するたびに、2 番目のリスト (黒)からアイテムを選択解除する必要があります。そのため、両方にSelectedItem同じものを使用しています。bindingそれがより良い方法であるかどうかは本当にわかりませんが、そのように機能するはずです。

私たちを手伝ってくれますか?

4

2 に答える 2

18

代わりに使用してみてくださいSelectedValue。これにより、表示されている動作が抑制されます

 <ListBox SelectedValue="{Binding MySelectedItem}" />

SelectedItem選択したアイテムがリストに見つからないSelectedValue場合、選択を解除しないようですが、選択を解除しているように見えますが、理由はわかりません

このサンプル アプリで違いを確認できます。

xaml:

<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="184" Width="208" x:Name="UI">
    <StackPanel DataContext="{Binding ElementName=UI}">
        <TextBlock Text="SelectedValue" />
        <StackPanel Orientation="Horizontal" Height="60" >
            <ListBox ItemsSource="{Binding MyItemSource1}" SelectedValue="{Binding MySelectedValue}" Width="100" />
            <ListBox ItemsSource="{Binding MyItemSource2}" SelectedValue="{Binding MySelectedValue}" Width="100" />
        </StackPanel>
        <TextBlock Text="SelectedItem" />
        <StackPanel Orientation="Horizontal" Height="60"  >
            <ListBox ItemsSource="{Binding MyItemSource1}" SelectedItem="{Binding MySelectedItem}" Width="100" />
            <ListBox ItemsSource="{Binding MyItemSource2}" SelectedItem="{Binding MySelectedItem}" Width="100" />
        </StackPanel>
    </StackPanel>
</Window>

コード:

public partial class MainWindow : Window , INotifyPropertyChanged
{
    private CustomObject _mySelectedItem;
    private CustomObject _mySelectedValue;
    private ObservableCollection<CustomObject> _items = new ObservableCollection<CustomObject>();
    private ObservableCollection<CustomObject> _items2 = new ObservableCollection<CustomObject>();

    public MainWindow()
    {
        InitializeComponent();
        MyItemSource1.Add(new CustomObject { Name = "Stack" });
        MyItemSource1.Add(new CustomObject { Name = "Overflow" });
        MyItemSource2.Add(new CustomObject { Name = "Stack" });
        MyItemSource2.Add(new CustomObject { Name = "Overflow" });
    }

    public ObservableCollection<CustomObject> MyItemSource1
    {
        get { return _items; }
        set { _items = value; }
    }

    public ObservableCollection<CustomObject> MyItemSource2
    {
        get { return _items2; }
        set { _items2 = value; }
    }

    public CustomObject MySelectedItem
    {
        get { return _mySelectedItem; }
        set { _mySelectedItem = value; NotifyPropertyChanged("MySelectedItem"); }
    }

    public CustomObject MySelectedValue
    {
        get { return _mySelectedValue; }
        set { _mySelectedValue = value; NotifyPropertyChanged("MySelectedValue"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

public class CustomObject
{
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}

ここに画像の説明を入力

于 2013-01-11T11:53:46.240 に答える
7

私がしなければならなかったことは、最初nullにプロパティに渡して変更を通知し、次に実際の値をプロパティに渡してビューに変更を通知することでした。そのように:

protected Bar selectedItem;
public Bar SelectedItem{
    get
    {
        return selectedItem;
    }
    set
    {
        selectedItem = null;
        NotifyPropertyChanged("SelectedItem");

        selectedItem = value;
        NotifyPropertyChanged("SelectedItem");
    }

この回答と例は、この質問から得ました。

于 2013-01-16T10:11:31.040 に答える