2010-02-04 3 views
5

Это водит меня NUTS !!!Как использовать MultiBinding в WPF ComboBox

У меня есть ComboBox, используемый для фильтрации запроса сотрудником, который отлично работает, но отображает только имя сотрудника. Я хочу использовать MultiValueConverter для отображения сотрудников полного имени (Это будет менее актуальным, если у нас не было 2 микрофонов и 2 DAVES)

Ниже мой рабочий код и IMultiValueConverter класса (с ненужными форматировании отделаны за краткости). Я пробовал все, что мог придумать, чтобы заставить MultiConverter работать, но мне не повезло.

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

модели представления свойств он обязан:

// 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 
     } 
    } 
} 

The 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; 
    } 
} 

Я пробовал много разных вещей, но в основном я использую следующие в ComboBox

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

В настоящее время преобразователь вызывается, когда программа инициализируется со значениями, установленными на DependencyProperty.UnsetValue. после этого он никогда не вызывается снова, даже если вы выберете имя из окна. Имена все еще отображаются как имя.

Спасибо за любую помощь или указатели за хорошие учебники/образцы, которые вы можете предоставить. Все те, что я продолжаю находить в Интернете, предназначены для текстовых полей, и я могу использовать их в течение всего дня.

ответ

19

Вы рядом! Что вы хотите сделать, это ComboBox.ItemTemplate, а не SelectedValue. Подготовьтесь к адскому аддону XAML.

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

Также, если я правильно помню, вам не нужно создавать свой собственный конвертер, если вы просто форматируете строки. Я думаю, что вы можете сделать следующее (кто-то пожалуйста, поправьте меня, если я ошибаюсь.)

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

Как ни странно это работает, но xaml с высокой частотой с ошибкой, ошибка читает «Свойство« Текст »не поддерживает значения типа« MultiBinding ».» Я уверен, что это будет легко исправить, но я оставляю его до утра, так как моя реальная проблема решена! Большое спасибо за помощь, я НЕНАВИЖУ ложиться спать с неразгаданной тайной, чтобы не спать. –

+0

Кстати, код, который у вас есть для форматирования без конвертера, отлично работает, как есть! –

+0

Это странная ошибка. Похоже, это может быть просто безвредная ошибка Сидра. – Josh

0

Вы можете быть лучше использовать шаблон данных для элементов, так что вы имеете полный контроль над тем, как отображается каждый человек в выпадающем списке.

Преобразование типа в порядке, если вам не нужно управлять форматированием разных полей.

0

Я закончил тем, что addig только для чтения свойства в моем классе и использовать DisplayMemberPath в Combobox

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

Могли бы что-то вроде этой работы для вашей ситуации ...? BR, Daniel

+0

Честно говоря, я понятия не имею, исходный вопрос с 2010 года и длинный мой радар :) –

+0

Я видел его ... Просто хотел опубликовать мой 2Cent на случай, если кто-то сможет его использовать :) – dba

Смежные вопросы