2011-09-22 6 views
6

Tôi có hơn 20 hộp kiểm trong biểu mẫu wpf của tôi. Tôi cần lưu trữ các giá trị IsChecked từ tất cả chúng trong một số đối tượng.Ràng buộc hộp kiểm - giải pháp tốt hơn là gì?

Tôi biết hai cách.

1) ràng buộc tất cả các hộp kiểm vào các thuộc tính trong đối tượng tương ứng sử dụng tài sản phụ thuộc như here

2) xử lý Clicked trường hợp tất cả trong số họ

Những giải pháp nào tốt hơn? Có một giải pháp tốt hơn chiếm ít không gian hơn trong code-behind?

Trả lời

3

Chắc chắn sử dụng một Binding

Nếu CheckBoxesfunction của bạn không liên quan và được khắp nơi, bạn sẽ cần 20 tài sản phụ thuộc khác nhau để ràng buộc vào trong DataContext của bạn hoặc ViewModel

Nếu CheckBoxesfunction của bạn là tất cả cùng nhau , chẳng hạn như được liệt kê cái khác hoặc trong một lưới điện, bạn có thể đặt chúng trong một bộ sưu tập và ràng buộc một ItemsControl cho họ

<ItemsControl ItemsSource="{Binding Options}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Description}" 
         IsChecked="{Binding IsChecked}" /> 
     </DataTemplate> 
    </ItemsControl> 
</ItemsControl> 

ViewModel của bạn hoặc DataContext sẽ chứa một cái gì đó như thế này:

private List<Option> options; 

private List<Option> Options 
{ 
    get 
    { 
     if (options== null) 
     { 
      options = new List<Option>(); 

      // Load Options - For example: 
      options.Add(new Option { Description = "Option A", IsChecked = false }); 
      options.Add(new Option { Description = "Option B" }); 
      options.Add(new Option { Description = "Option C", IsChecked = true}); 
     } 
     return options; 
    } 
} 

Và lớp Option của bạn chỉ đơn giản là sẽ

public class Option 
{ 
    public string Description { get; set; } 
    public bool IsChecked { get; set; } 
} 
+0

+1 - mặc dù tôi thích sử dụng IsSelected; IsChecked ngụ ý rằng đối tượng sẽ luôn bị ràng buộc vào một hộp kiểm (hoặc tương tự). –

1

Để lưu IsChecked bang tôi sẽ đề nghị làm theo cái đầu tiên (using binding), nó là tốt hơn bởi vì ràng buộc cho phép giữ giao diện người dùng và mã đằng sau sạch hơn và tách riêng. Thứ hai (handling an event) là giống như cách tiếp cận WinForms vì vậy tôi không thấy lý do tại sao bạn nên làm theo nó trong ứng dụng WPF.

EDIT: Câu trả lời cho câu hỏi liên quan đến nhiều thuộc tính

Nếu phụ thuộc vào những gì thực sự được ràng buộc với một Xem và cách kiểm tra hộp được đặt trong View. Nếu bạn đang sử dụng một số ItemsControl container như ListView và mỗi hộp kiểm thuộc về đơn hàng/cột - bạn có thể ràng buộc tất cả các hộp kiểm vào một bộ sưu tập duy nhất như

private IList<bool> states; 
public IList<bool> States 
{ 
    get 
    { 
     return this.states; 
    } 

    set 
    { 
     this.states = value; 
     this.OnPropertyChanged("States"); 
    } 
} 

Để cung cấp cho bạn một câu trả lời cụ thể - chia sẻ xin vui lòng UI bố trí của Biểu mẫu nơi các hộp kiểm được đặt.

+0

Yay, cố gắng giải thích nó tốt hơn xin vui lòng, tiếng Anh của tôi không đủ tốt. Số nào tốt hơn? –

+0

@Andrew: xem câu trả lời được cập nhật, về cơ bản đầu tiên một - 1, thứ hai - 2 :). Từ quan điểm của tôi về ràng buộc xem tốt hơn nhiều chỉ để lưu trữ các giá trị – sll

+0

Cùng một câu hỏi như tôi đã đăng lên câu trả lời của David Basarab ... –

2

Ràng buộc.

Lý do rất đơn giản. Nếu bạn quyết định kết nối với sự kiện IsChecked, bạn sẽ phải có thêm mã để tìm ra thuộc tính nào trong hộp kiểm nào.

Trường hợp tệ hơn là bạn có phương pháp cho từng trường hợp.

Có ràng buộc khi bạn đặt nó vào hộp kiểm bạn đã hoàn tất. Tất cả những gì bạn phải làm là lưu đối tượng ở cuối.

+0

Tuy nhiên, sẽ có khoảng 20 thuộc tính phụ thuộc trong mã sau, phải không? Một thuộc tính cho mỗi hộp kiểm. –

+0

@Andrew Có, mặc dù nếu Checkbox của bạn là tất cả trong cùng một khu vực bạn có thể làm một danh sách các đối tượng có chứa 'Mô tả' và' IsChecked', và ràng buộc chúng vào một 'ItemsControl'. – Rachel

+0

Nhưng bạn không thực sự cần phải đối phó với các thuộc tính phụ thuộc. Bạn có thể có một trường hợp mà bạn sử dụng cùng một sự kiện nhấp chuột cho tất cả 20 và sau đó cập nhật một mảng đối tượng nhưng bạn vẫn sẽ yêu cầu logic để xác định hộp kiểm nào được gọi là sự kiện. Nhưng nếu bạn có một mảng đối tượng, bạn có thể sẽ sử dụng một cái gì đó giống như một ListBox cho các đối tượng đã có. – Paparazzi

2

Nếu bạn sử dụng khung MVVM tốt, bạn có thể sử dụng liên kết mà không cần phải thực hiện chúng bằng tay (chỉ đặt tên cho một số quy ước) - Tôi thích Caliburn Micro nhưng có rất nhiều thứ tốt.