WPF ComboBox数据绑定ItemsSource item.ToString()到属性setter。为什么?

时间:2011-02-01 14:31:49

标签: wpf data-binding mvvm combobox

由于某种原因,当我将ComboBox绑定到POCO列表时,绑定到SelectedValue的属性被设置两次:

  1. 值= POCO.ToString()
  2. 使用value = POCO.Key属性,这是预期的行为
  3. 我有以下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 个答案:

答案 0 :(得分:2)

除了根据您的XAML绑定到SelectedValue的属性应设置为POCO.Key值而不是POCO.Value(正如您所预期的那样)之外,您的代码中的所有内容都可以正常显示。我刚刚创建了一个类似设置的测试项目,一切正常。

或者,您可以尝试将combobox的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类型。