C#绑定收到的数据

时间:2017-03-03 19:10:07

标签: c# wpf mvvm

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

 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; }
}

2 个答案:

答案 0 :(得分: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),那么您已经拥有一个可绑定到(只读)控件的集合(列表) (a DataGrid)。

例如

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

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

答案 1 :(得分:0)

您可以将每个Value打包在视图模型的属性中,然后在其中调用PropertyChanged,也可以修改DataStructure类以触发PropertyChanged。但是,您必须使DataStructure非静态,以便在其上实现INotifyPropertyChanged。

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