Как изменить число в массиве. Пожалуйста помоги.
У меня есть массив 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>
Простите, я раньше не показывал код. Исправленный.
Вы можете использовать:
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;
ProgressBar
Попробуй это:
private void Button_Click(object sender, RoutedEventArgs e)
{
var arr = Resources["arrayOfInt32"] as int[];
arr[0] = 10;
}
INotifyPropertyChanged
- он даже не имеет смысла, посколькуStaticResource
используется для чего-то статического, которое не изменяется. Вы должны связать со свойством, в котором реализованINotifyPropertyChanged
.System.Int32
не реализуетINotifyPropertyChanged
, поэтому ваша привязка не знает, когда элементы изменяются. Создайте свой собственный класс, который реализуетINotifyPropertyChanged
и привяжите его