2011-03-25 53 views
0

这不是一件容易的事。绑定到数组元素不会更新

我有一个listbox(elementSelection)和一个文本块(elementViewer)。 elementViewer显示数组的一个元素,它由elementSelection框选择。所有这些工作,即使我编程修改数组中的一个元素的变化反映在elementViewer。 下面是代码:

public class ArrElem : INotifyPropertyChanged 
{ 
    public ArrElem(double d) 
    { 
     wert = d; 
    } 

    private double intwert; 
    public double wert 
    { 
     get { return intwert; } 
     set 
     { 
      intwert = value; 
      NotifyPropertyChanged("wert"); 
     } 
    } 
    // Declare the PropertyChanged event 
    public event PropertyChangedEventHandler PropertyChanged; 

    // NotifyPropertyChanged will raise the PropertyChanged event passing the 
    // source property that is being updated. 
    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

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

private ObservableCollection<int> indexArrField = new ObservableCollection<int>(); 
public ObservableCollection<int> indexArr { get { return indexArrField; } set { indexArrField = value; } } 


    public MainWindow() 
    { 
     Arr.Add(new ArrElem(1.1)); 
     Arr.Add(new ArrElem(2.2)); 
     for (int i = 0; i < Arr.Count; i++) 
     { 
      indexArr.Add(i); 
     } 

     InitializeComponent(); 
     DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // this one doesn't show on elementViewer 
     //double d = Arr[0].wert + 0.1; 
     //Arr.RemoveAt(0); 
     //Arr.Insert(0, new ArrElem(d)); 

     // this one shows on elementViewer 
     Arr[0].wert += 0.1; 
    } 

public class MySpecialMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     int i = int.Parse(values[0].ToString()); 
     ObservableCollection<ArrElem> arr = values[1] as ObservableCollection<ArrElem>; 

     if (arr == null || i >= arr.Count || i < 0) 
      return DependencyProperty.UnsetValue; 

     return arr[i]; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     object[] ooo = new object[1]; 
     ooo[0] = DependencyProperty.UnsetValue; 
     return ooo; 
    } 
} 



    <local:MySpecialMultiConverter x:Key="multiConverter" /> 

    <ListBox Name="elementSelection" ItemsSource="{Binding indexArr}"></ListBox> 

    <TextBlock Name="elementViewer" Text="{Binding Path=wert}" > 
     <TextBlock.DataContext> 
      <MultiBinding Converter="{StaticResource multiConverter}"> 
       <Binding ElementName="elementSelection" Path="SelectedIndex" /> 
       <Binding Path="Arr" /> 
      </MultiBinding> 
     </TextBlock.DataContext> 
    </TextBlock> 

现在我的问题: 正如你在Button_Click的代码中看到,这些变化对个人ArrElem在elementViewer显示出来,但如果我更换ArrElem elementViewer不更新。

在两种情况下,我必须更改以获取elementViewer的更新?

回答

1

我猜这个列表框在你从绑定集合中删除后不再有选定的项目了。 (SelectedIndex == -1)。尝试改变后设置它:

var selectedIndex = elementSelection.SelectedIndex; 
double d = Arr[0].wert + 0.1; 
Arr.RemoveAt(0); 
Arr.Insert(0, new ArrElem(d)); 
elementSelection.SelectedIndex = selectedIndex; 

BTW:您可以将绑定TextBlock直接向您的ListBoxSelectedItem财产。无需编写一个转换器。

+0

不,SelectedIndex不会改变,它无助于重新设置。 不,我不能直接绑定到SelectedItem没有转换器,因为我不会访问数组元素然后(或者至少我不知道如何)。 – MTR 2011-03-25 10:03:09

+0

'SelectedItem'是数组元素。 – 2011-03-25 10:04:01

+0

对不起,我没有看到这个。但它没有帮助,SelectedItem是indexArr的元素,而不是Arr的元素。我需要这个indexArray,因为在我的应用程序中应该有可能选择当前不存在的数组元素。 – MTR 2011-03-25 10:47:33