【问题标题】:C# binding received dataC#绑定接收到的数据
【发布时间】:2017-03-03 19:10:07
【问题描述】:

我有客户端-服务器应用程序,客户端从服务器获取数据并将其保存在静态类中:

 public static class DataStructure
    {
        //! Значение каждой переменной
        public static Value AxisX = new Value(@"axis_x", Dividers.AxisX);
        public static Value AxisY = new Value(@"axis_y", Dividers.AxisY);
        public static Value AxisZ = new Value(@"axis_z", Dividers.AxisZ);
        public static Value Temp = new Value(@"temp", Dividers.Temp);
        public static Value GirX = new Value(@"gir_x", Dividers.GirX);
        public static Value GirY = new Value(@"gir_y", Dividers.GirY);
        public static Value GirZ = new Value(@"gir_z", Dividers.GirZ);
        ...

        public static List<Value> ListOfValues = new List<Value>
        {
            AxisX,
            AxisY,
            AxisZ,
            Temp,
            GirX,
            GirY,
            GirZ,
            ....
        }
        ...

客户端应用程序具有 GUI(带有 MVVM 模式的 WPF)。客户端每 1 秒从服务器接收一次数据,它们必须显示在窗口中。 Screenshot (click)

如果我想要它,我必须RaisePropertyChanged(),但我不想干涉DataSctructure 类并使用RaisePropertyChanged() 创建属性。最好的方法是什么?我可以在 ViewModel 中创建很多属性(如AxisXAxisY、...),并从ListOfValues 分配数据,但我认为这是不合理的。

或者,可能是,我必须更改应用程序的结构?

更新 1:

    public class Value
        {
            public Value(string name, double divider = 1.0)
            {
                Name = name;
                Divider = divider;
                HexCode = string.Empty;
                IntValue = 1;
                PhysValue = 1.0;
            }

            public readonly string Name;
            public readonly double Divider;
            public string HexCode { get; private set; }
            public int IntValue { get; private set; }
            public double PhysValue { get; private set; }
}

【问题讨论】:

  • Value 是如何定义的?
  • @user1892538 我更新了帖子

标签: c# wpf mvvm


【解决方案1】:

例如查看我的answer here:在这种情况下

public class Value: INotifyPropertyChanged
    {
       public event PropertyChangedEventHandler PropertyChanged;

       protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
       {
          //this.VerifyPropertyName(propertyName);

          PropertyChangedEventHandler handler = this.PropertyChanged;
          if (handler != null)
          {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
           }
        }

如果 Value 是一个具有属性的类(如 IntValuePhysValue,即至少有一个 getter),那么您已经有一个可绑定到(只读)控件(@987654325 @)。

例如

private double physValue;        
public double PhysValue { 
  get { return physValue; } 
  set {
     physValue = value;
     RaisePropertyChanged();
  }
}

当然,您必须详细说明才能实现所需的屏幕截图

【讨论】:

  • 据我了解,我必须在Value 类中创建属性(在set 中调用RaisePropertyChanged())并在XAML 中绑定它们?
  • 再看我的回答,有例子
【解决方案2】:

您可以将每个Value 包装在视图模型上的属性中并在那里调用PropertyChanged,或者您可以修改DataStructure 类以触发PropertyChanged。但是,您必须将 DataStructure 设为非静态才能在其上实现 INotifyPropertyChanged。

说到这里,为什么要将可变数据存储在静态类中?这是一个非常糟糕的主意...

【讨论】:

  • 我的第一个想法是立即改变DataStructure 类...将其设为静态不是我的想法...
  • 好的。如果我不想产生很多变量并保存我的代码干净,我该怎么办?制作而不是List - ObservableList 并在更改集合时制作事件然后绑定它?
  • 我很难说什么更适合您的情况,因为您的代码很少显示您正在尝试做什么。实际上,您提到每秒都会更新数据,但是您链接的类只显示每个字段的硬编码值。另一件事是,您应该使用公共属性而不是公共字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2019-01-07
  • 2013-07-25
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多