【问题标题】:Observablecollection is not working with WCF data contract classObservablecollection 不适用于 WCF 数据协定类
【发布时间】:2015-04-11 20:06:30
【问题描述】:

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


问题: 如果 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;
        }
    }
}


客户端-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>

编辑:

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

【问题讨论】:

  • 对我来说看起来不错,即使您的 ViewModel 没有实现 INotifyPropertyChanged,您也应该在组合框中看到 Task1、Task2、Task3,唯一的原因一定是您的 DataContext 是未设置为 SomeViewModel 的实例
  • 我还设置了 DataContext 像这样 -> `this.DataContext = SomeViewModel.Instance;` 我在同一个窗口中有 2 个相同的下拉菜单,我注意到的一个区别是一个类在客户端的服务和其他(正在工作的)中实现。 @decoherence
  • 我发现问题出在哪里......我已经实现了一些逻辑,从服务器获取任务,然后再清除该列表。由于没有从服务器添加到列表的任务,因此下拉列表为空......感谢您的帮助,我可能会删除这个问题。 :D @decoherence
  • 很高兴它成功了,大多数时候问题比你想象的要简单

标签: c# wpf wcf observablecollection


【解决方案1】:

看来您需要为SomeViewModel 类实现INotifyPropertyChanged 接口。虽然ObservableCollection 是一个不错的选择,但您这样做时不会修改 XAML 代码:

set
{
    this._objectiveList = value;
}

改为:

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

请参阅 the documentation 了解 INotifyPropertyChanged 的实施细节。

【讨论】:

  • 很抱歉,忘记说明了,我将编辑我的问题。 @Alex Sikilinda
  • 感谢您的帮助,那是我的错误,还有其他逻辑导致了这个问题。@Alex Sikilinda
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多