Observablecollection不适用于WCF数据协定类

时间:2015-04-11 11:52:25

标签: c# wpf wcf observablecollection

:定位:
我需要将类绑定到组合框并在其中显示一个字符串值(名称)。


问题: 如果使用Observablecollection类创建DataContract,则组合框(下拉列表)不会显示任何值。


其他信息:
如果我使用一个简单的类而不是DataContract一切正常! 我不想重新创建Objective和其他类,重复代码是坏事。

代码:

服务:

[DataContract]
public class Objective
{
    /// <summary>
    /// Objective constructor
    /// </summary>
    public Objective()
    {
    }

    [DataMember]
    public int ID
    {
        get;
        set;
    }
    [DataMember]
    public string Name
    {
        get;
        set;
    }
    [DataMember]
    public string Description
    {
        get;
        set;
    }
}


Client- ViewModel:

public class SomeViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Objective> _objectiveList;

    public SomeViewModel()
    {
        this._objectiveList = new ObservableCollection<Objective>()
        {
            new Objective {
                Name="Task1"
            },
            new Objective {
                Name="Task2"
            },
            new Objective {
                Name="Task3"
            },
        };
    }

    public ObservableCollection<Objective> ObjectiveList
    {
        get
        {
            return this._objectiveList;
        }
        set
        {
            this._objectiveList = value;
        }
    }
}


Client- Window.Xaml

<ComboBox Grid.Row="0" x:Name="cbxTaskList" DisplayMemberPath="Name"
    ItemsSource="{Binding Path=ObjectiveList, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.Text>
        <Binding Path="SelectedObjective" UpdateSourceTrigger="PropertyChanged"/>
    </ComboBox.Text>
    <ComboBox.SelectedItem>
        <Binding Path="SelectedObjective" UpdateSourceTrigger="PropertyChanged"/>
    </ComboBox.SelectedItem>
</ComboBox>

修改

我忘记了menthion我正在为我的视图模型实现INotifyPropertyChanged。如果我使用简单的类(不是DataContract类),一切正常。

1 个答案:

答案 0 :(得分:2)

您似乎需要为INotifyPropertyChanged类实现SomeViewModel接口。虽然ObservableCollection是一个很好的选择,但是在执行以下操作时不会修改XAML代码:

set
{
    this._objectiveList = value;
}

取而代之的是:

set
{
    this._objectiveList = value;
    PropertyChanged("ObjectiveList");
}

有关INotifyPropertyChanged实施详情,请参阅 the documentation