wpf 如何在阵列上使用“OnPropertyChanged”

tag5nh1u  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(135)

我正试图用C#/WPF做一个天气应用程序作为我的第一个项目。我真的迷路了,找不到我做错了什么。
这是我的变量字符串数组weatherWeek,我想用未来7天的温度来填充它。

private string[] _weatherWeek = new string[7];

public string[] weatherWeek
        {
            get
            {
                return _weatherWeek;
            }
            set
            {
                _weatherWeek = value;
                OnPropertyChanged(nameof(weatherWeek));
            }
        }

这是我用来获取未来7天温度的代码。当我使用Debu.WriteLine(Weather[0]);时,我可以看到数据在那里。

public async Task GetWeatherTempWeek()
        {
            for (int i = 0; i < 7; i++)
            {
                JObject jObjectWeek = JObject.Parse(jsonDataWeek);
                weatherWeek[i] = (string)jObjectWeek["days"][i]["temp"] + "°C";
            }
        }

这里是我绑定weatherWeek变量的XAML代码的一部分。

<TextBlock Text="{Binding weatherWeek[0], UpdateSourceTrigger=PropertyChanged}"
                Height="68"
                Width="68"
                FontSize="30"
                FontWeight="Bold"
                FontFamily="Tunga"
                TextAlignment="Center"/>

老实说,我甚至不记得我试过的所有东西。问题是它对普通变量有效,但对数组变量无效。

pbpqsu0x

pbpqsu0x1#

您没有调用负责通知UI的OnPropertyChanged(nameof(weatherWeek));,作为一种变通方案,您可以在进行更改后简单地调用它

for (int i = 0; i < 7; i++)
    {
        JObject jObjectWeek = JObject.Parse(jsonDataWeek);
        weatherWeek[i] = (string)jObjectWeek["days"][i]["temp"] + "°C";
    }
OnPropertyChanged(nameof(weatherWeek));
dfty9e19

dfty9e192#

若要通知集合更改,集合必须实现INotifyCollectionChanged接口。在常规数组中,不实现此接口。
这些解决方案中很可能有一个适合您。

1)更换整个阵列。

public async Task GetWeatherTempWeek()
    {
            weatherWeek = JObject.Parse(jsonDataWeek)["days"]
                .Select(day => $"{day["temp"]}°C")
                .ToArray();
    }

2)如果需要在集合中使用逐个元素替换函数,则应将数组更改为ObservableCollection

x一个一个一个一个x一个一个二个x

相关问题