2011-03-25 54 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