Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置一个";“图像”;元素内部按钮单击_C#_Wpf - Fatal编程技术网

C# 设置一个";“图像”;元素内部按钮单击

C# 设置一个";“图像”;元素内部按钮单击,c#,wpf,C#,Wpf,我对数据绑定概念非常陌生,所以如果您觉得我的问题很愚蠢,请原谅。本项目将学习一些API功能和WPF数据绑定。但当我试图通过将WPF中图像元素的数据上下文设置为一个类的属性(该类存储用于在屏幕上显示的图像的路径)来在屏幕上显示图标时,我会遇到以下问题。 我有以下图像: <Image x:Name="imgWeatherIcon" Grid.Column="2" HorizontalAlignment="Left" Margin=&q

我对数据绑定概念非常陌生,所以如果您觉得我的问题很愚蠢,请原谅。本项目将学习一些API功能和WPF数据绑定。但当我试图通过将WPF中图像元素的数据上下文设置为一个类的属性(该类存储用于在屏幕上显示的图像的路径)来在屏幕上显示图标时,我会遇到以下问题。 我有以下图像:

<Image x:Name="imgWeatherIcon" Grid.Column="2" HorizontalAlignment="Left" Margin="380,134,0,0" VerticalAlignment="Top"
           Width="90" Height="90" Source="{Binding ImgPath, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, diag:PresentationTraceSources.TraceLevel=High}">
        <Image.DataContext>
            <c:ConditionsNow/>
        </Image.DataContext>
    </Image>
请注意,“imgWeatherIcon”是一个标签,我在其中显示图标/图像,并将其DataContext设置为属性“ImgPath”。这只是为了澄清“imgWeatherIcon”,因为它没有包含WPF代码,但如果需要,我可以这样做

如果每次启动应用程序时都执行此操作,则datacontext将正确设置为ImgPath属性,并在UI中更新

但这里是我需要它工作的地方,我不知道为什么它不工作:

    public ConditionsNow condObject = new();

    private async void BtnCity_Click(object sender, RoutedEventArgs e)
    {
        imgWeatherIcon.DataContext = condObject;
        condObject.ImgPath = @"G:\Visual Studio\Projects\Testing\AccuWeatherApp\accuweather-icon.jpg";
                    
    }

我知道我缺乏数据绑定和WPF方面的知识,但如果有人能告诉我问题所在,我将不胜感激。我做了很多关于装订等方面的研究,但仍然没有弄明白这一点。顺便说一句,如果这对属性“ImgPath”有帮助,我已经实现了INotifyPropertyChanged,以便能够跟踪更改。

您不应该更改整个DataContext绑定。只需设置一次DataContext,然后只更改绑定到UI的基础属性。在您的情况下,您应该只更改ImgPath属性。因此,请从按钮单击事件中删除以下内容:

imgWeatherIcon.DataContext = condObject;
确保ConditionsNow实现INotifyPropertyChanged接口,以便在更改ImgPath的值时可以调用OnPropertyChanged()。这是为了确保绑定将导致UI更改其表示形式

因此,您的ConditionsNow类应具有与以下类似的表单:

public class ConditionsNow
{    
    private string _imgPath;
    public string ImgPath
    {
        get => _imgPath;
        set
        {
            _imgPath = value;
            OnPropertyChanged();
        }
    }
}

我明白你的意思,我试过了,但这是否意味着我在主窗口中设置了DataContext(启动时),然后只更改属性“ImgPath”?如果是,这将如何工作,因为我正在将数据绑定到从类ConditionsNow创建的对象,并且我无法在按钮单击中更改实例化对象的属性。这就是我必须更改“ImgPath”属性的地方,因为在按钮中,单击就是发生这种情况的地方。如果数据绑定到主窗口内的对象,我如何在btn click内更改它?如果我想更改按钮click内的“ImgPath”属性,您能给我一个示例吗?并且在程序启动时已经设置了datacontext。因为这就是我试图实现的,当单击此按钮时,数据取自web源,“ImgPath”必须更改为正确的图像,但不知道如何在不生成包含属性的类实例的情况下更改它。我不能使用主窗口中的那个,因为它是完全不同的实例。重置DataContext没有任何效果,因为您总是将它设置为相同的值,即
condObject
。这实际上并不是一个改变(无论如何,这是一个坏主意)。将属性重置为相同的图像路径也不起作用,因为默认情况下,WPF会根据从中加载图像的URI缓存图像(假设单击处理程序打算从相同的文件路径重新加载新图像)。除此之外,在单向绑定上设置UpdateSourceTrigger=PropertyChanged是毫无意义的。我假设我将图像源绑定到类中的“ImgPath”属性,然后创建该类的实例并将其分配给datacontext,因此每当我更改“ImgPath”时属性,它接受新值并反映在图像源中,因此基本上,如果我给它新图像路径(到新图像),它将显示新图像。“ImgPath”的全部思想是,我将该属性的值设置为我想要显示的各个图像,并且所有图像都是从网页中获取的。我不应该将datacontext设置为相同的值,这是有道理的。然后看看答案。。。
public class ConditionsNow
{    
    private string _imgPath;
    public string ImgPath
    {
        get => _imgPath;
        set
        {
            _imgPath = value;
            OnPropertyChanged();
        }
    }
}