0

我是 WPF 和绑定的新手,我想看看是否有办法在数组元素和控件之间进行双向绑定:

我的 ViewModel 有一个如下所示的属性:

public ObservableCollection<MeaseurementValue> MeasurementValues
        {
            get
            {
                return Config.MeasurementValues;
            }
            set
            {
                if (value == null) return;
                Config.MeasurementValues = value;
                OnPropertyChanged("MeasurementValues");
                QpatConfig.SerializeConfigFile(Config,
                    Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)) + "//Qualcomm//QPAT//qpat.config");              
            }
        }

其中 MeasurementValues 定义如下:

public class MeaseurementValue
    {
      public string TestName { get; set; }
      public int value { get;set; }
    }

Xaml 如下所示:

 <TextBox HorizontalAlignment="Left" Grid.Column="1"   Grid.Row="1"   Height="23" Margin="14,20,0,0" TextWrapping="Wrap" Text="{Binding MeasurementValues[0].value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="124"  />

因此,xaml 中的元素绑定到 ViewModel 中的 Arrayelement。但是当我在文本控件中更改该属性时,它不会调用 ViewModel 的设置器。

我还更改了我的代码,数组中的每个元素也是可通知的,因此如下所示:

public class MeaseurementValue : INotifyPropertyChanged
    {
      public event PropertyChangedEventHandler PropertyChanged;
      public string TestName { get; set; }    

      private int _value;
      public int value
      {
          get { return _value; }
          set { _value = value; OnPropertyChanged("value"); }
      }

      void OnPropertyChanged(string propertyName)
      {
          var handler = PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(propertyName));
          }
      }
    }

但这也没有用

与原始类型相反,我们与数组有什么不同吗?

4

1 回答 1

2

setter 被调用,而不是你期望的那个。在双向绑定中,只有路径中的最后一个属性被更新(在目标->源方向)。

可以这样想——如果你用 C# 编写它,你期望会发生什么?

MeasurementValues[0].value = 1;

这里发生的是首先调用MeasurementValues getter,然后调用数组索引器的getter,但settervalue属性的。因此,没有理由调用数组的 setter。您是远离MeasurementValuessetter 的两个属性访问器。即使你写

MeasurementValues[0] = new MeasurementValue();

MeasurementValues不会调用setter 。仅有的

MeasurementValues = new ObservableCollection<MeaseurementValue>();

会导致您所指的 setter 被调用。这与绑定完全相同。属性路径中的最后一项是双向绑定中使用的唯一设置器。在你的情况下,它是value财产。

如果要在每次value设置属性时保存配置,可以:

  • 创建一个ValueChanged事件MeaseurementValue并在创建每个项目时将其连接起来
  • 使用一些 pub/sub 机制(例如 Prism 的Event Aggregator)来发布值已更改
于 2013-10-07T22:03:35.777 回答