Как мне изменить число в массиве XAML в Window.Resources

1

Как изменить число в массиве. Пожалуйста помоги.

У меня есть массив XAML:

<Window.Resources>
  <x:Array x:Key="arrayOfInt32" x:Type="sys:Int32">
    <sys:Int32>0</sys:Int32>
    <sys:Int32>5</sys:Int32>
    <sys:Int32>0</sys:Int32>
    <sys:Int32>0</sys:Int32>
    <sys:Int32>0</sys:Int32>
  </x:Array>
</Window.Resources>

Как изменить число в массиве с помощью кода С# с помощью кнопки (Button_Click)?

И код для обновления значения progressbar, из массива:

<ItemsControl x:Name="listLights" ItemsSource="{Binding Source=StaticResource arrayOfInt32}}">
 <ItemsControl.ItemsPanel>
  <ItemsPanelTemplate>
   <WrapPanel IsItemsHost="True" Orientation="Vertical" />
  </ItemsPanelTemplate>
 </ItemsControl.ItemsPanel>
 <ItemsControl.ItemTemplate>
  <DataTemplate>
   <Grid>
    <Grid.RowDefinitions>
     <RowDefinition Height="25" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
     <ColumnDefinition Width="150" />
    </Grid.ColumnDefinitions>
    <ProgressBar    
     Value="{Binding Mode=OneWay}" 
     VerticalContentAlignment="Center"
     HorizontalContentAlignment="Center" 
     Name="pbLight"
     HorizontalAlignment="Center"
     VerticalAlignment="Center"
     Margin="4"
     Width="138"
     Height="17" />
   </Grid>
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

Простите, я раньше не показывал код. Исправленный.

  • 0
    Вы, конечно, не реализовали интерфейс INotifyPropertyChanged - он даже не имеет смысла, поскольку StaticResource используется для чего-то статического, которое не изменяется. Вы должны связать со свойством, в котором реализован INotifyPropertyChanged .
  • 0
    Вы не можете привязать массив массива, потому что System.Int32 не реализует INotifyPropertyChanged , поэтому ваша привязка не знает, когда элементы изменяются. Создайте свой собственный класс, который реализует INotifyPropertyChanged и привяжите его
Показать ещё 2 комментария
Теги:
arrays
xaml
numbers

2 ответа

0
Лучший ответ

Вы можете использовать:

  int[] arrayOfInt32 = this.Resources["arrayOfInt32"] as int[];

или FindResource или TryFindResource.

Ошибка в вашем XAML - это не x:Type но просто введите Type="sys:Int32".

Хотя любые обновления, которые вы делаете для arrayOfInt32 в вашем коде, не будут отображаться в ProgressBar потому что arrayOfInt32 не реализует INotifyPropertyChanged, поэтому элемент управления ProgressBar не знает, что произошло это изменение.

Ты можешь:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;    \
...

public partial class MyWindow : Window, INotifyPropertyChanged
{
    //Observable collection 
    private ObservableCollection<int> _arrayOfInt32;
    public ObservableCollection<int> ArrayOfInt32
    {
        get { return _arrayOfInt32; }
        set
        {
            _arrayOfInt32 = value;
            NotifyPropertyChanged();
        }
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
    ....

    //Put this line in the constructor after InitializeComponent
    this.DataContext = this;
    ArrayOfInt32 = new ObservableCollection<int>(this.Resources["arrayOfInt32"] as int[]);

И измените XAML:

    <ItemsControl ItemsSource="{Binding Path=ArrayOfInt32}">

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

        ArrayOfInt32[0] = 50;
        ArrayOfInt32[1] = 80;
  • 0
    ProgressBar-s не работает на форме с новыми номерами через кнопку (Button_Click). Это только для начальной формы. Извините за мой плохой английский.
  • 0
    @VentDushan, возможно, разместите немного больше кода, как вы обновляете свой ProgressBar
Показать ещё 3 комментария
0

Попробуй это:

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        var arr = Resources["arrayOfInt32"] as int[];
        arr[0] = 10;
    }
  • 0
    ProgressBar-s не работает на форме с новыми номерами через кнопку (Button_Click). Это только для начальной формы. Извините за мой плохой английский.
  • 0
    @VentDushan что ты имеешь в виду?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню