2009-12-16 8 views
10

Trên viewmodel của tôi, tôi có một thuộc tính int và tôi muốn hiển thị nó để chỉnh sửa bằng ComboBox, với một số lựa chọn giới hạn, chẳng hạn như 16, 8, 4 và 2. Có cách nào để chỉ định các lựa chọn trong XAML, trong khi vẫn còn ràng buộc giá trị trở lại viewmodel? Tôi muốn làm một cái gì đó như thế này:Dữ liệu ràng buộc WPF ComboBox với các lựa chọn được xác định trong XAML?

<ComboBox SelectedValue="{Binding MyIntProperty}"> 
    <ComboBoxItem>16</ComboBoxItem> 
    <ComboBoxItem>8</ComboBoxItem> 
    <ComboBoxItem>4</ComboBoxItem> 
    <ComboBoxItem>2</ComboBoxItem> 
</ComboBox> 

Tôi biết tôi có thể dàn dựng một List<int> trong mã và thiết lập đó là ItemsSource, nhưng tôi hy vọng có một cách để làm điều này mà không liên quan đến một thuộc tính bổ sung trong viewmodel cho thấy một bộ sưu tập được tạo trong mã.

Trả lời

13

Bạn có thể chỉ định lựa chọn của mình chính xác như trong ví dụ. Những gì nó trông giống như thiếu của bạn, để làm cho nó hoạt động, là tài sản SelectedValuePath. Không có nó, SelectedValue sẽ giống như SelectedItem. Bằng cách thiết lập SelectedValuePath = "Nội dung" trong ComboBox bạn có thể chỉ định rằng SelectedValue ràng buộc của bạn thay vì ràng buộc chỉ là một phần của SelectedItem, trong trường hợp này Int nội dung bạn chỉ định là nội dung trong mỗi ComboBoxItem.

Dưới đây là một bản trình diễn nhỏ với nó, và cũng ràng buộc giá trị vào một TextBox, nơi bạn có thể đặt mục và xem nó được phản ánh trong ComboBox thông qua liên kết SelectedValue (hoặc ngược lại).

<StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Set Value:" /> 
     <TextBox Text="{Binding MyIntProperty, UpdateSourceTrigger=PropertyChanged}" /> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="Select Value:" /> 
     <ComboBox SelectedValue="{Binding MyIntProperty}" SelectedValuePath="Content"> 
      <ComboBoxItem>2</ComboBoxItem> 
      <ComboBoxItem>4</ComboBoxItem> 
      <ComboBoxItem>6</ComboBoxItem> 
      <ComboBoxItem>8</ComboBoxItem> 
      <ComboBoxItem>16</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</StackPanel> 
+0

Ahh cảm ơn. Tôi đã thực sự cố gắng điều đó nhưng nghĩ rằng nó không hoạt động vì tài sản của tôi chưa được thiết lập. Tuy nhiên, tốt đẹp để có câu trả lời này một cách rõ ràng ra khỏi đó như tôi không thể tìm thấy nó khi tìm kiếm. – RandomEngy