2012-01-01 15 views

Trả lời

18

Tôi thích sử dụng liên kết với SelectedItem và triển khai bất kỳ chức năng nào trong cài đặt thuộc tính ràng buộc.

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

...

public class ViewModel 
{ 
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem; 
    public Item SelectedItem 
    { 
     get { return selectedItem; } 
     set 
     { 
      if (selectedItem == value) 
       return; 
      selectedItem = value; 
      // Do logic on selection change. 
     } 
    } 
} 
+0

Mẹo tuyệt vời, cảm ơn bạn – James

+0

Nó có hoạt động với nhiều lựa chọn không? – Simsons

+0

@Simsons Chỉ khi bạn có cách để liên kết với nhiều lựa chọn. Tôi tin rằng thuộc tính SelectedItem bị bỏ qua trong quá trình chọn nhiều lần. –

0

Tôi khuyên bạn nên sử dụng RelayCommand. Sử dụng MVVM Light Toolkit hoặc chỉ sử dụng các lớp RelayCommandCommandManager từ Josh Smith's implementations. Cá nhân tôi chỉ sử dụng hai lớp, vì vậy tôi không cần toàn bộ bộ công cụ.

Trong khi điều này chắc chắn sẽ hoạt động, có thể có một cách dễ dàng hơn tùy thuộc vào những gì bạn đang làm. Có thể dễ dàng ràng buộc một đối tượng với số SelectedValue của số ListBox và lắng nghe giá trị đó thay đổi.

+0

Cảm ơn tất cả các bạn đã trợ giúp) Chúc mừng năm mới !!! –

2

Về cơ bản bạn có một vài lựa chọn:

  1. Sử dụng SelectedItem tài sản của ListBox để ràng buộc vào một tài sản trong backend (tức là theo quan điểm của mô hình) và thực hiện logic trong setter như được mô tả bởi Cameron MacFarland.
  2. Sử dụng thư viện của bên thứ ba có sự kiện chung để chỉ huy hành vi như trong liên kết được đăng bởi Pedro Lamas.
  3. Nếu bạn không muốn sử dụng thư viện của bên thứ ba hoặc viết logic bên trong thiết lập thuộc tính thì bạn không thể chấp nhận hành vi của riêng bạn để kiểm soát ListBox. Nó sẽ đăng ký sự kiện SelectionChanged của điều khiển và thực thi lệnh (lệnh có thể là thuộc tính phụ thuộc được hiển thị bởi hành vi).
15

Đây là cách mà bạn có thể đến lựa chọn thay đổi các sự kiện trong MVVM ứng dụng của bạn Trước hết tôi nói với bạn rằng chỉ huy tài sản chỉ làm việc tại nút bây giờ chúng tôi phải Rõ ràng ràng buộc tài sản đó trong trường hợp đã thay đổi lựa chọn của chúng tôi như Danh sách hộp hoặc combo box trong XMAL bạn nộp

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118"> 

     <Local:Interaction.Triggers> 
      <Local:EventTrigger EventName="SelectionChanged"> 
       <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/> 
      </Local:EventTrigger> 
     </Local:Interaction.Triggers> 
    </ListBox> 

cho điều này bạn phải thêm Syatem.Windows dll.Tương tác bây giờ u có thêm tài liệu tham khảo trong file namespace XAML của bạn như

xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity" 

trong ViewModel lớp của bạn, bạn phải xác định lệnh của bạn trong cấu trúc Côn

public ViewModel123() 
    { 
     MyCommand = new RelayCommand<string>(TestMethod); 

    } 

tại tạo ra các phương pháp TestMethod mà có thể xử lý lựa chọn đã thay đổi sự kiện

private void TestMethod(string parameter) 
    { 
     MessageBox.Show(parameter); 
    } 

tôi hy vọng điều này có thể giúp bạn.

+0

Tôi thích cách này vì tôi nghĩ nó sạch hơn. –