Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到数组元素不需要';t更新_C#_.net_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 绑定到数组元素不需要';t更新

C# 绑定到数组元素不需要';t更新,c#,.net,wpf,xaml,data-binding,C#,.net,Wpf,Xaml,Data Binding,这不是一件容易的事 我有一个列表框(elementSelection)和一个文本块(elementViewer)。elementViewer显示由elementSelection box选择的数组的一个元素。所有这些都有效,即使我以编程方式修改数组中的一个元素,更改也会反映在elementViewer中。 代码如下: public class ArrElem : INotifyPropertyChanged { public ArrElem(double d) {

这不是一件容易的事

我有一个列表框(elementSelection)和一个文本块(elementViewer)。elementViewer显示由elementSelection box选择的数组的一个元素。所有这些都有效,即使我以编程方式修改数组中的一个元素,更改也会反映在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>
公共类ArrElem:INotifyPropertyChanged
{
公共欠费(双d)
{
wert=d;
}
私人双保险;
公共双wert
{
获取{return intwert;}
设置
{
intwert=数值;
通知财产变更(“wert”);
}
}
//声明PropertyChanged事件
公共事件属性更改事件处理程序属性更改;
//NotifyPropertyChanged将引发传递
//正在更新的源属性。
public void NotifyPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
私有ObservableCollection arrField=新ObservableCollection();
公共可观测集合Arr{get{return arrField;}set{arrField=value;}}
私有ObservableCollection indexArrField=新ObservableCollection();
public observeCollection indexArr{get{return indexArrField;}set{indexArrField=value;}}
公共主窗口()
{
Arr.Add(新的ArrElem(1.1));
Arr.Add(新的ArrElem(2.2));
对于(int i=0;i=arr.Count | | i<0)
返回dependencProperty.unset值;
返回arr[i];
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
object[]ooo=新对象[1];
ooo[0]=DependencyProperty.UnsetValue;
返回ooo;
}
}
现在我的问题是: 正如您在按钮的代码中所看到的,对单个ArrElem的更改显示在elementViewer中,但是如果我替换ArrElem elementViewer,则不会更新


在这两种情况下,我必须更改什么才能更新elementViewer?

我猜在您从绑定集合中删除列表框后,该列表框中不再有所选项目。(
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;

顺便说一句:您可以将
TextBlock
直接绑定到
列表框的
SelectedItem
属性。无需编写转换器。

否,SelectedIndex不会更改,重新设置也没有帮助。不,如果没有转换器,我无法直接绑定到SelectedItem,因为那时我无法访问数组元素(或者至少我不知道如何)。SelectedItem是数组元素。
SelectedItem
。抱歉,我没有看到这个。但是它没有帮助,SelectedItem是indexArr的元素,而不是Arr的元素。我需要这个indexArray,因为在我的应用程序中,应该可以选择目前不存在的数组元素。啊,我没有看到列表框在传递给转换器时没有绑定到同一个数组。问题是,
SelectedIndex
Arr
都不会引发
PropertyChanged
事件,这就是为什么不会重新计算文本框上的绑定。尝试使用
elementViewer.GetBindingExpression(TextBox.TextProperty).UpdateTarget().GetBindingExpression返回null