2014-08-29 85 views
1

如何更改數組中的數字。請幫忙。如何更改Window.Resources中數組XAML中的數字

我有一個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> 

如何使用C#代碼從一個按鈕(Button_Click)我改變數組中的數字?

和代碼更新進度條值,從數組:

<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的屬性。 – 2014-08-29 06:59:54

+0

因爲'System.Int32'沒有實現'INotifyPropertyChanged',所以你不能綁定到整型數組,因此你的綁定不知道元素何時被改變。創建自己的類,實現'INotifyPropertyChanged'並綁定它 – IVAAAN123 2014-08-29 07:00:18

+0

爲您添加了一個工作解決方案。 – 2014-08-29 08:27:51

回答

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}"> 

當你manipulte與價值觀,用的ObservableCollection做到這一點:

 ArrayOfInt32[0] = 50; 
     ArrayOfInt32[1] = 80; 
+0

ProgressBar-s無法通過按鈕(Button_Click)使用新數字在窗體上工作。這僅用於開始形式。對不起,我的英語不好。 – 2014-08-29 06:30:06

+0

@VentDushan可能會發布多一點的代碼,你如何更新你的'ProgressBar' – 2014-08-29 06:38:26

+0

而'不工作'不是很理解。它拋出異常?它沒有像預期的那樣得到更新? – 2014-08-29 06:43:29

0

試試這個:

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var arr = Resources["arrayOfInt32"] as int[]; 
     arr[0] = 10; 
    } 
+0

ProgressBar-s無法通過按鈕(Button_Click)使用新數字在窗體上工作。這僅用於開始形式。對不起,我的英語不好。 – 2014-08-29 06:29:11

+0

@VentDushan你是什麼意思? – IVAAAN123 2014-08-29 06:42:55

+0

對不起,我以前沒有顯示過代碼。糾正。 – 2014-08-29 06:50:28

相關問題