2010-02-04 22 views
5

Đây là lái xe cho tôi NUTS !!!Làm thế nào để sử dụng MultiBinding trong một ComboBox WPF

Tôi có một ComboBox được sử dụng để lọc truy vấn của nhân viên hoạt động tốt nhưng chỉ hiển thị tên nhân viên. Tôi muốn sử dụng số MultiValueConverter để hiển thị tên đầy đủ của nhân viên (Điều này sẽ ít khẩn cấp hơn nếu chúng tôi không có 2 Mikes và 2 Daves)

Dưới đây là mã làm việc của tôi và IMultiValueConverter Lớp (Với định dạng không cần thiết được cắt ngắn để ngắn gọn). Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến để có được MultiConverter để làm việc nhưng tôi đã không có may mắn.

<ComboBox ItemsSource="{Binding Path=EmployeesFilter}" 
         DisplayMemberPath="EmpFirstName" 
         SelectedValue="{Binding Path=EmployeeToShow, Mode=TwoWay}"/> 

ViewModel Thuộc tính nó là ràng buộc để:

// This collection is used to populate the Employee Filter ComboBox 
private ObservableCollection<Employee> employeesFilter; 
public ObservableCollection<Employee> EmployeesFilter 
{ 
    get { 
      return employeesFilter; 
     } 
    set { 
     if (employeesFilter != value) 
     { 
      employeesFilter = value; 
      OnPropertyChanged("EmployeesFilter"); 
     } 
    } 
} 

// This property is TwoWay bound to the EmployeeFilters SelectedValue 
private Employee employeeToShow; 
public Employee EmployeeToShow 
{ 
    get { 
      return employeeToShow; 
     } 
    set { 
     if (employeeToShow != value) 
     { 
      employeeToShow = value; 
      OnPropertyChanged("EmployeeToShow"); 
      QueryIssues(); // Requery with new employee filter 
     } 
    } 
} 

Các IMultiValueConverter:

class StringsToFullNameMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, 
          Type targetType, 
          object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     // I added this because I kept getting DependecyProperty.UnsetValue 
     // Passed in as the program initializes 
     if (values[0] as string != null) 
     { 
      string firstName = (string)values[0]; 
      string lastName = (string)values[1]; 
      string fullName = firstName + " " + lastName; 
      return fullName; 
     } 
     return null; 
    } 

    public object[] ConvertBack(object value, 
           Type[] targetTypes, 
           object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

tôi đã cố gắng rất nhiều thứ khác nhau nhưng về cơ bản đang sử dụng sau trong ComboBox

<ComboBox.SelectedValue> 
    <MultiBinding Converter="{StaticResource StringsToFullNameMultiConverter}" 
        Mode="OneWay" > 
      <Binding Path="EmpFirstName" /> 
      <Binding Path="EmpLastName"/> 
    </MultiBinding> 
</ComboBox.SelectedValue> 

Hiện tại, trình biến đổi được gọi khi chương trình khởi tạo với các giá trị được đặt thành DependencyProperty.UnsetValue. sau đó nó không bao giờ được gọi lại, ngay cả khi bạn chọn một tên từ hộp. Tên vẫn được hiển thị dưới dạng tên.

Cảm ơn bạn đã giúp đỡ hoặc gợi ý đến các hướng dẫn/mẫu tốt mà bạn có thể cung cấp. Tất cả những gì tôi tiếp tục tìm kiếm trên web đều dành cho hộp văn bản và tôi có thể sử dụng chúng một cách tốt đẹp cả ngày.

Trả lời

19

Bạn thân thiết! Những gì bạn muốn làm mặc dù là ComboBox.ItemTemplate, không phải SelectedValue. Chuẩn bị cho một số địa ngục XAML.

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource StringsToFillNameMultiConverter}"> 
        <Binding Path="EmpFirstName" /> 
        <Binding Path="EmpLastName" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

Ngoài ra, nếu tôi nhớ chính xác, bạn không cần tạo trình biến đổi của riêng mình nếu bạn chỉ định dạng chuỗi. Tôi nghĩ bạn có thể làm như sau (ai đó vui lòng sửa tôi nếu tôi sai.)

<!-- "Last, First" --> 
<MultiBinding StringFormat="{}{1}, {0}"> 
    <Binding Path="EmpFirstName" /> 
    <Binding Path="EmpLastName" /> 
</MultiBinding> 
+0

Rất tiếc công việc này nhưng xaml bị đánh dấu sai, lỗi đọc "Thuộc tính 'văn bản' không hỗ trợ giá trị loại 'MultiBinding'." Tôi chắc chắn nó sẽ là một sửa chữa dễ dàng nhưng tôi để nó cho đến khi buổi sáng kể từ khi vấn đề thực sự của tôi được giải quyết! Cảm ơn rất nhiều vì sự giúp đỡ, tôi HATE đi ngủ với một bí ẩn chưa được giải quyết để giữ cho tôi tỉnh táo –

+0

Nhân đây, Mã bạn có để định dạng mà không có một công cụ chuyển đổi hoạt động hoàn hảo như nó được! –

+0

Đó là một lỗi lạ. Nghe có vẻ như nó chỉ là một lỗi Cider vô hại. – Josh

0

Bạn có thể sử dụng mẫu dữ liệu cho các mục, vì vậy bạn có toàn quyền kiểm soát cách hiển thị của từng người trong danh sách thả xuống.

Loại chuyển đổi là OK miễn là bạn không cần phải kiểm soát định dạng của các trường khác nhau.

0

tôi đã kết thúc bằng addig Thuộc tính chỉ đọc đến lớp tôi và sử dụng Displaymemberpath trong Combobox

public class MyEmployee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName { 
    get { return FirstName + " " + LastName; } 
     } 
} 

một cái gì đó giống như tác phẩm này với tình hình của bạn có thể ...? BR, Daniel

+0

Thành thật mà nói tôi không có ý kiến, câu hỏi ban đầu là từ năm 2010 và là dài tắt radar của tôi :) –

+0

Tôi đã thấy nó ... Chỉ có nghĩa là để gửi 2Cent của tôi trong trường hợp ai đó có thể sử dụng nó :) – dba

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