WPF ComboBox привязывает данные ItemsSource item.ToString () к установщику свойств. Зачем? - PullRequest
0 голосов
/ 01 февраля 2011

По какой-то причине, когда я связываю ComboBox со списком POCO, свойство, привязанное к SelectedValue, устанавливается дважды:

  1. Со значением = POCO.ToString ()
  2. Со значением = POCO.Key свойство, , которое является предполагаемым поведением

У меня есть следующий ComboBox, который привязан к свойствам в моей ViewModel:

<ComboBox ItemsSource="{Binding Path=AllowedClassifications}" 
          DisplayMemberPath="Value" 
          SelectedValue="{Binding Path=TargetGroup.Classification}" 
          SelectedValuePath="Key" />

Свойства в ViewModel определены как:

//ICollection is implemented by ObservableCollection<T>
//DataBaseFieldValue has two public properties: string Key, string Value
public ICollection<DatabaseFieldValue> AllowedClassifications
{
    get { return _allowedClassifications; }
    private set { _allowedClassifications = value; }
}

public Model.TargetGroup TargetGroup
{
    get { return _targetGroup; }
    private set { _targetGroup = value; OnPropertyChanged("TargetGroup"); }
}   

TargetGroup.Classification определяется как:

public string Classification
{
    get { return _classification; }
    set 
    {
        System.Diagnostics.Debug.WriteLine("Classification: " + value);
        _classification = value; 
        OnPropertyChanged("Classification"); 
    }
}

Отладочный вывод:

Классификация: MyNamespace.DatabaseFieldValue

Классификация: 2

Что здесь происходит? Я делаю это совершенно неправильно?

1 Ответ

2 голосов
/ 01 февраля 2011

В вашем коде все выглядит нормально, за исключением того факта, что в соответствии с вашим XAML для свойства, которое связано с SelectedValue, должно быть установлено значение POCO.Key, а не POCO.Value (как вы и ожидали). Я только что создал тестовый проект с подобной настройкой, и все работает.

В качестве альтернативы, вы можете попробовать использовать свойство SelectedItem в выпадающем списке в сочетании с ItemTemplate:

<ComboBox ItemsSource="{Binding Path=AllowedClassifications}"    
          SelectedItem="{Binding Path=TargetGroup.Classification}" >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Value}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

В этом случае свойство TargetGroup.Classification должно иметь тип DatabaseFieldValue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...