2013-01-11 104 views
8

我有以下問題之間單選:我有兩個ListBox,有兩個不同的ItemSource,但他們兩人都對SelectedItem相同binding,因爲我試圖執行這些之間的一個選擇兩個列表。WPF兩個ListBox

這裏有一個形象,更好的顯示問題:

First list in red. Second list in black.

什麼會我喜歡做什麼?每次我從第一個列表中選擇一個項目(紅色)時,應該從第二個列表(黑色)中選擇取消選擇SelectedItem,反之亦然。這就是爲什麼我爲他們使用相同的binding。 我真的不知道,如果它是更好的方式來做到這一點,但它應該工作那樣。

你能幫我嗎?

+0

我認爲你應該使用一個自定義的附加行爲,而不是... –

+0

@FelicePollano但我怎麼能做到這一點?你會有一些代碼來幫忙嗎? –

+0

什麼是你的物品類型? – Clemens

回答

3

我有什麼需要做的就是在第一遍null的財產,並通知了變化,然後我通過實際價值的財產,並通知了變化到視圖。 就像是:

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

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

我得到這個答案,例如,從this question

12

使用SelectedValue代替,這將吸乾你所看到的行爲嘗試

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

看來,SelectedItem不取消被選擇的項目沒有在列表中找到,但SelectedValue似乎以取消選擇它,不知道爲什麼

你可以看到在這個示例應用程序的diffence:

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; 
    } 
} 

enter image description here

+0

我嘗試使用'SelectedValue',但它沒有奏效。我認爲這是因爲我調用另一個'屬性set'內的方法,它需要一個不同於'null'的值,如果我使用'SelectedValue',它會嘗試將null設置爲我的屬性。我不知道我是否清楚這個評論。 –

+0

這個工作,但現在我開始想,爲什麼我需要的SelectedItem然後? – mkb