2010-09-23 84 views
12

Tôi đang sử dụng để làm những việc nhưWPF giá trị combobox và hiển thị văn bản

State.Items.Add(new ListItem { Text = "SomeState", Value = NumericIDofState }); 

Trường hợp Nhà nước là một Listbox trong ASP.NET.

Làm cách nào để tôi đạt được điều tương tự với ComboBox WPF? Tôi thấy một thuộc tính được gọi là 'Nội dung' trong đối tượng ComboBoxItem nhưng làm cách nào để gán cho mỗi mục một giá trị khác với những gì được hiển thị cho người dùng? Hãy giúp tôi.

+0

ví dụ: một số giá trị int –

Trả lời

1

Nếu bạn bỏ qua các giá trị gia tăng, sau đó tôi nghĩ rằng nó khá đơn giản để thêm một mục mới vào một ComboBox trong thời gian chạy.

comboBox1.Items.Add("SomeText"); 

comboBox1.SelectedIndex = comboBox1.Items.Count - 1; 

Thuộc tính SelectedIndex được thiết lập để Items.Count-1 để các mục mới được thêm vào sẽ xuất hiện trong ComboBox như mục đã chọn.

15

WPF Combobox có:

  • SelectedValuePath tài sản đó quy định cụ thể đường dẫn đến tài sản đó được sử dụng để xác định giá trị của SelectedValue tài sản. Nó tương tự như thuộc tính Value của ASP.NET ListItem.
  • DisplayMemberPath thuộc tính xác định mẫu mặc định mô tả cách hiển thị đối tượng dữ liệu. Nó tương tự như tài sản Text của ASP.NET ListItem.

Hãy nói rằng bạn muốn bạn Combobox để hiển thị một bộ sưu tập của KeyValuePair đối tượng sau:

private static readonly KeyValuePair<int, string>[] tripLengthList = { 
    new KeyValuePair<int, string>(0, "0"), 
    new KeyValuePair<int, string>(30, "30"), 
    new KeyValuePair<int, string>(50, "50"), 
    new KeyValuePair<int, string>(100, "100"), 
}; 

Bạn xác định một tài sản trong mô hình quan điểm của bạn trở về bộ sưu tập mà:

public KeyValuePair<int, string>[] TripLengthList 
{ 
    get 
    { 
     return tripLengthList; 
    } 
} 

Sau đó, XAML của bạn cho số Combobox sẽ là:

<ComboBox 
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" 
    ItemsSource="{Binding TripLengthList, Mode=OneTime}" 
    SelectedValuePath="Key" 
    DisplayMemberPath="Value" /> 

Nơi bạn đặt SelectedValuePathDisplayMemberPath thuộc tính vào tên thuộc tính mong muốn của các đối tượng (KeyValue tương ứng) hiển thị theo số Combobox.

Hoặc, nếu bạn thực sự muốn thêm các mục vào Combobox ở mã phía sau thay vì sử dụng một ràng buộc, bạn cũng có thể làm điều đó.Ví dụ:

<!--XAML--> 
<ComboBox x:Name="ComboBoxFrom" 
    SelectedValue="{Binding FilterService.TripLengthFrom, Mode=TwoWay}" /> 

// Code behind 
public partial class FilterView : UserControl 
{ 
    public FilterView() 
    { 
     this.InitializeComponent(); 

     this.ComboBoxFrom.SelectedValuePath = "Key"; 
     this.ComboBoxFrom.DisplayMemberPath = "Value"; 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(0, "0")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(30, "30")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(50, "50")); 
     this.ComboBoxFrom.Items.Add(new KeyValuePair<int, string>(100, "100")); 
    } 
10

Nếu bạn chỉ muốn để lộ một tài sản đơn giản trong viewmodel và xử lý văn bản cho những lựa chọn trong giao diện bạn có thể làm một giải pháp đơn giản như thế này:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}"> 
     <ComboBoxItem Content="First choice" Tag="0"/> 
     <ComboBoxItem Content="Second choice" Tag="1"/> 
     <ComboBoxItem Content="Third choice" Tag="2"/> 
    </ComboBox> 

Ví dụ với một tài sản bool:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}"> 
     <ComboBoxItem Content="No" Tag="False"/> 
     <ComboBoxItem Content="Yes" Tag="True"/> 
    </ComboBox> 

Type-verbose lựa chọn thay thế (ví dụ bản gốc)

Dưới đây là các giải pháp thay thế dài dòng hơn, nơi các loại được tuyên bố rõ ràng. Tùy thuộc vào phong cách ưa thích của bạn (hoặc có thể một số loại yêu cầu nó), có thể nó phù hợp với bạn tốt hơn.

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding YourIntProperty, Mode=TwoWay}"> 
    <ComboBoxItem Content="First choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>0</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Second choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>1</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Third choice"> 
     <ComboBoxItem.Tag> 
      <sys:Int32>2</sys:Int32> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
</ComboBox> 

Ví dụ với một tài sản bool:

<ComboBox SelectedValuePath="Tag" SelectedValue="{Binding IsActive, Mode=TwoWay}"> 
    <ComboBoxItem Content="No"> 
     <ComboBoxItem.Tag> 
      <sys:Boolean>False</sys:Boolean> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
    <ComboBoxItem Content="Yes"> 
     <ComboBoxItem.Tag> 
      <sys:Boolean>True</sys:Boolean> 
     </ComboBoxItem.Tag> 
    </ComboBoxItem> 
</ComboBox> 

Các namespace sys được khai báo như thế này:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
+1

ví dụ tuyệt vời với boolean. đúng thứ tôi cần. tôi cũng không thích đặt tất cả các chuỗi giao diện người dùng có sẵn (để chọn từ) trong viewmodel của tôi, tôi chỉ muốn chúng trong XAML. – Fredrik

+1

tại sao thẻ không phải là "True"? – dovid

+1

@dovid cảm ơn vì đề nghị này, tôi đã thử nghiệm và nó hoạt động. Tôi đã cập nhật câu trả lời của mình với các ví dụ đơn giản, nhưng vẫn giữ các ví dụ cũ trong trường hợp cần thiết cho các trường hợp góc. – TGasdf

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