【问题标题】:Static Property Bind to Grid in wpfwpf中的静态属性绑定到网格
【发布时间】:2021-01-17 03:21:49
【问题描述】:

我的类库中有很多静态属性。我想用两种方式绑定网格中的属性值。怎么绑定呢?

public class AllStaticProperty
{
    public static int JA{get;set;}
    public static float JB{get;set;}
    public static bool JC{get;set;}
    public static int[] JD=new int[1000];
    //More properties here
    public static float[] ZZ=new float[2000];
}

我想绑定静态属性名称网格第一列字段,用户在网格第二列中输入属性值,然后返回以将值存储在静态属性中。如何绑定(我有超过 3000 个静态属性)

【问题讨论】:

  • AllStaticProperty 类需要实现 INotifyPropertyChanged 接口才能让自己的属性绑定到 UI
  • 您想看到它们随着时间的推移而更新吗?还是“一次性”绑定?

标签: wpf data-binding datagridview datagrid


【解决方案1】:

如果要绑定属性并在用户界面中反映对它们的更改,则必须在相应的类中实现 INotifyPropertyChanged 并在属性更改其值时引发 PropertyChanged 事件以触发控件中的绑定更新获取最新值。

但是,静态属性不能访问实例方法,那么它们应该如何引发属性更改通知呢?正如您在related post 中看到的那样,有一些方法可以实现这一点,但这是糟糕的设计。这里的另一个问题是双向绑定非静态类的静态属性,但也有workarounds

我建议过度考虑您的设计并创建实现 INotifyPropertyChanged 的视图模型,例如:

public class SampleViewModel : INotifyPropertyChanged
{
   private int _ja;
   public int JA
   {
      get => _ja;
      set
      {
         if (_ja == value)
            return;

         _ja = value;
         OnPropertyChanged();
      }
   }

   // ...other properties and backing fields.

   public event PropertyChangedEventHandler PropertyChanged;

   protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}

然后,您可以使用通常的语法绑定一个属性,并添加 Mode=TwoWay(如果这不是默认值)。

SomeProperty="{Binding JA, Mode=TwoWay}"

另一种选择是创建一个或多个按上述方式实现的包装视图模型,但访问您的AllStaticProperty 类的静态属性,但是您还需要将视图模型与静态属性同步,如果任何静态属性更改。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2011-01-18
    • 2021-09-16
    • 1970-01-01
    • 2010-10-30
    • 2014-09-10
    相关资源
    最近更新 更多