将Array的元素绑定到xaml属性

时间:2017-10-15 04:03:31

标签: c# xaml uwp uwp-xaml

在我得到重复的问题之前,我只想说我似乎无法找到问题的解决方案。我想做的就是将一个数组元素绑定到一个属性,但由于我缺乏经验,似乎无法弄清楚如何。

以下是我的C#代码的外观:

public class MainPageImplement : INotifyPropertyChanged
{
    BitmapImage[] weatherIconSource = new BitmapImage[7];
    public BitmapImage[] WeatherIconSource
    {
        get { return weatherIconSource; }
        set
        {
            weatherIconSource = value;
            NotifyPropertyChanged("WeatherIconSource");
        }
    }
    private void NotifyPropertyChanged(string propName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

以下是我的XAML属性的外观:

       <Image Grid.Column="1" Name="WeatherIconZero" Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Center" />

我的代码执行时没有任何错误,但实际上并没有绑定任何东西。但是,如果我使用BitmapImage变量而不是数组中的元素,它就可以正常工作。

2 个答案:

答案 0 :(得分:1)

数组不能绑定到UI,至少不是每个索引。您需要使用ObservableCollection<T>

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage>();

不要打扰使用数组;您无法通知单索引属性更改

NotifyPropertyChanged("WeatherIconSource[5]"); // Doesn't work.

如果您坚持使用数组,则只要更新单个索引,就必须通知整个集合中已更改的属性:

WeatherIconSource[5] = myNewBitmap;
NotifyPropertyChange("WeathIconSource"); // Updates all [0] [1] ... [n]

但是如果你这样做,你将强制刷新所有索引。您的所有图像都将重绘。如果你的应用程序很简单,图片很小,你就可以侥幸成功;否则,请将更改更改为ObservableCollection<T>

如果您使用具有精确索引的硬编码绑定,请执行以下操作:

Source="{x:Bind PropertyName.WeatherIconSource[0], Mode=OneWay}"
Source="{x:Bind PropertyName.WeatherIconSource[2], Mode=OneWay}"
Source="{x:Bind PropertyName.WeatherIconSource[5], Mode=OneWay}"

然后像这样实例化你的收藏,这样你就不会得到IndexOutOfRangeException

public ObservableCollection<BitmapImage> WeatherIconSource { get; } = new ObservableCollection<BitmapImage>
{
    null, // [0]
    null, // [1]
    null,
    null,
    null,
    null,
    null  // [6]
};

答案 1 :(得分:0)

应该是,

`<Image Grid.Column="1" Name="WeatherIconZero"  Source="{Binding weatherIconSource[0]}" HorizontalAlignment="Center" VerticalAlignment="Center" /`>