2013-01-11 41 views
8

Tôi gặp vấn đề sau: Tôi có hai ListBox, với hai khác nhau ItemSource, nhưng cả hai đều có cùng một binding cho SelectedItem, bởi vì tôi đang cố gắng thực hiện một lựa chọn duy nhất giữa các hai danh sách.WPF Lựa chọn duy nhất giữa hai ListBox

Dưới đây là một hình ảnh mà chương trình tốt hơn các vấn đề:

First list in red. Second list in black.

Tôi muốn làm gì đây? Mỗi lần tôi chọn một mục từ danh sách đầu tiên (màu đỏ), cần bỏ chọn số SelectedItem từ danh sách thứ hai (màu đen) và ngược lại. Đó là lý do tại sao tôi đang sử dụng cùng một binding cho cả hai. Tôi thực sự không biết nếu đó là cách tốt hơn để làm điều đó, nhưng nó sẽ làm việc như thế.

Bạn có thể giúp tôi không?

+0

Tôi nghĩ bạn nên sử dụng hành vi được đính kèm tùy chỉnh thay thế ... –

+0

@FelicePollano Nhưng làm cách nào tôi có thể làm điều đó? Bạn sẽ có một số mã để giúp đỡ? –

+0

Loại mặt hàng của bạn là gì? – Clemens

Trả lời

3

Những gì tôi phải làm là lúc đầu vượt qua null đối với tài sản và thông báo sự thay đổi, và sau đó tôi đã thông qua giá trị thực sự đối với tài sản và thông báo sự thay đổi để xem. Giống như:

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

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

Tôi nhận được câu trả lời này và ví dụ từ this question.

12

Hãy thử sử dụng SelectedValue thay vào đó, điều này sẽ SOP hành vi mà bạn đang nhìn thấy

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

Dường như SelectedItem không bỏ chọn là sản phẩm được chọn không có trong danh sách, Nhưng SelectedValue dường như để bỏ chọn nó, không chắc chắn lý do tại sao

Bạn có thể xem diffence trong ứng dụng của mẫu này:

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> 

mã:

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

Tôi đã thử bằng cách sử dụng 'SelectedValue', nhưng nó không hoạt động. Tôi nghĩ đó là bởi vì tôi đang gọi một phương thức khác bên trong 'thuộc tính' mà cần một giá trị khác với' null', và nếu tôi sử dụng 'SelectedValue', bằng cách nào đó nó đã cố gắng đặt null vào thuộc tính của tôi. Tôi không biết liệu tôi có rõ ràng với nhận xét này không. –

+0

công trình này, nhưng bây giờ tôi bắt đầu nghĩ tại sao tôi cần SelectedItem sau đó ?! – mkb

Các vấn đề liên quan