C # wpf не будет обновляться с помощью привязки массива

#c# #wpf #binding

#c# #wpf #обязательный

Вопрос:

У меня есть простой Ellispis в wpf, который я привязываю к элементу массива «Data [0]», чтобы анимировать его. Проблема в том, что когда я привязываю его к этому массиву и переключаю его значение «true / false», это никак не влияет на пользовательский интерфейс.

Но когда я меняю привязку на другой общедоступный bool из того же класса. Никаких проблем

 <Ellipse Width="19"
Height="18"
Margin="29,137,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Fill="{Binding Data[0], 
    Converter={StaticResource BooleanToBrushConverter}, 
    Mode=OneWay,
    UpdateSourceTrigger=PropertyChanged}"
Stroke="Black" />
 

Когда я привязываюсь к этому массиву, пользовательский интерфейс не обновляется:

     public bool[] Data
    {
        get{ return _data; }
        set{ _data= value; }
    }
    private bool[] _data= new Boolean[20];
 

Когда я выполняю привязку к этому bool, он работает:

     public bool DataSimple
    {
        get { return _dataSimple; }
        set { _dataSimple=value; }
    }
    private bool _dataSimple;
 

Это используется для обновления значений и контроля, которые он достиг, и оба показывают хороший результат при отладке:

     private void RefreshData(object sender, EventArgs e)
    {
        _data= _process.DataRes;
        _dataSimple= _process.DataRes[0];
        Debug.WriteLine(_data[0]);
        Debug.WriteLine(_dataSimple);
    }
 

Может кто-нибудь попробовать помочь мне в этом?
Спасибо

Комментарии:

1. Мне кажется, это потому, что вы привязываетесь к индексу массива bool 0, а не к самому массиву bool (который имеет получатель / установщик). Попробуйте создать BooleanArrayToBrushConverter, где вы берете только первый элемент и возвращаете его кисть. Затем измените свою привязку на `Fill=»{Привязка данных, конвертер = {StaticResource BooleanArrayToBrushConverter},». Я также не понимаю, как все это работает без INotifyPropertyChanged, но я отвлекся.

2. Под переключением я подразумевал переключение «значение = не значение» с «true на false» или «false на true». Я новичок в C #. Но со всеми вашими комментариями я это сделал. Вместо использования массива я использовал ObservableCollection, я привязал его к пользовательскому классу, а также добавил INotifyPropertyChanged, после чего он заработал. Мне нужно больше узнать об этом, потому что это работает, но, на мой взгляд, неясно, как все ведут себя и взаимодействуют. Спасибо, ребята

Ответ №1:

В вашем вопросе неясно, что именно вы меняете и ожидаете запуска обновления пользовательского интерфейса.

Если вы обновляете отдельные значения bool, замените bool[] их на ObservableCollection<bool> и инициализируйте соответствующим количеством элементов.

Если вы предоставляете совершенно новый массив значений bool, то ваши классы должны быть реализованы INotifyPropertyChanged для обновленных свойств.