Dot-Net

綁定到數組元素

  • August 30, 2016

我正在嘗試將 TextBlock 綁定到 ObservableCollection 中的特定元素。這就是我現在所做的:

private ObservableCollection<double> arr = new ObservableCollection<double>();
public ObservableCollection<double> Arr { get { return arr; } set { arr = value; }  }

testBox.DataContext = this;

private void Button_Click(object sender, RoutedEventArgs e)
{
  Arr[0] += 1.0;
}

   [ValueConversion(typeof(ObservableCollection<double>), typeof(String))]
   public class myObsCollConverter : IValueConverter
   {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
           ObservableCollection<double> l = value as ObservableCollection<double>;
           if( l == null )
               return DependencyProperty.UnsetValue;
           int i = int.Parse(parameter.ToString());

           return l[i].ToString();
       }

       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
           return DependencyProperty.UnsetValue;
       }
   }


   <Window.Resources>
       <local:myObsCollConverter x:Key="myConverter"/>
   </Window.Resources>

       <TextBlock Name="testBox" Text="{Binding Path=Arr,Converter={StaticResource myConverter}, ConverterParameter=0}" />

我看到的是 testBox 在創建時顯示了 Arr 的第一個值。但這並不反映此元素的任何更改。我必須做什麼才能看到 Arr 的變化

在我的文本框中?

不需要轉換器。你可以直接綁定到Arr[0]like this

<TextBlock Name="testBox" Text="{Binding Path=Arr[0]}"/>

中的元素Arr需要實現INotifyPropertyChanged才能動態更新。

更新:詳細說明一下:

public class MyDouble : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   private double _Value;
   public double Value 
   { 
       get { return _Value; } 
       set { _Value = value; OnPropertyChanged("Value"); }
   }

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

然後

ObservableCollection<MyDouble> Arr { get; set; }

並綁定到

<TextBlock Name="testBox" Text="{Binding Path=Arr[0].Value}"/>

引用自:https://stackoverflow.com/questions/5415858