在我得到重复的问题之前,我只想说我似乎无法找到问题的解决方案。我想做的就是将一个数组元素绑定到一个属性,但由于我缺乏经验,似乎无法弄清楚如何。
以下是我的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变量而不是数组中的元素,它就可以正常工作。
答案 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" /`>