C# 如何确保单击时UI更新到正确的图像?

C# 如何确保单击时UI更新到正确的图像?,c#,xaml,uwp,C#,Xaml,Uwp,我正在与xaml和c#合作一个UWP项目。我有一个stackpanel的图像在右边,你可以点击图像,它会显示一个相关的更大的图像在stackpanel的左边 加载页面时,大图像最初设置为与stackpanel中第一个“小”图像相关的“大”图像,但当您单击stackpanel中的任何其他小图像时,大图像不会更新 整个过程就是一个放置在弹出按钮中的数据模板。“大”图像的相关xaml如下所示: <Border Background="White" Grid.Row="2"> <

我正在与xaml和c#合作一个UWP项目。我有一个stackpanel的图像在右边,你可以点击图像,它会显示一个相关的更大的图像在stackpanel的左边

加载页面时,大图像最初设置为与stackpanel中第一个“小”图像相关的“大”图像,但当您单击stackpanel中的任何其他小图像时,大图像不会更新

整个过程就是一个放置在弹出按钮中的数据模板。“大”图像的相关xaml如下所示:

<Border Background="White" Grid.Row="2">
    <Image Stretch="Uniform">
        <Image.Source>
            <BitmapImage UriSource="{Binding SelectedImage}" />
        </Image.Source>
    </Image>
</Border>
我使用上面的代码来设置图像的初始,它的工作。单击小图像时,它不会更改大图像

在调试过程中,当我单击stackpanel中的小图像时,我在“image tapped”方法处中断,我可以看到uri得到了正确的更新,并且没有绑定错误。用户界面永远不会改变

我错过了什么

谢谢,, 扎克


*旁注:“obj”只是自定义类的一个虚构名称。

对于
绑定
属性,您需要实现
INotifyPropertyChanged
类,以便自动更新UI

class CustomClass : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string _imageLink;
    public string ImageLink
    {
        get
        {
            return _imageLink;
        }
        set
        {
            _imageLink = value;
            RaisePropertyChanged();
        }
    }

    private void RaisePropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

}
或者,在使用
点击事件时,为什么不给XAML元素一个
x:name
,并将该名称的图像源设置为您的
URi

要更新
ImageLink
属性,您需要在更改属性的页面中创建
CustomClass
的实例

CustomClass ab=new CustomClass()


ab.ImageLink=“此处编码”

对于
绑定
属性,您需要实现
INotifyPropertyChanged
类,以便自动更新UI

class CustomClass : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string _imageLink;
    public string ImageLink
    {
        get
        {
            return _imageLink;
        }
        set
        {
            _imageLink = value;
            RaisePropertyChanged();
        }
    }

    private void RaisePropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

}
或者,在使用
点击事件时,为什么不给XAML元素一个
x:name
,并将该名称的图像源设置为您的
URi

要更新
ImageLink
属性,您需要在更改属性的页面中创建
CustomClass
的实例

CustomClass ab=new CustomClass()



ab.ImageLink=“此处编码”

看起来有点像您是单击图像的源,该图像可能已经显示了该图像。您确定要更改正确图像的imagesource吗?我不确定您在问什么。您是在问我是否只是简单地将相同的uri重新分配给大图像?我是在问您是否正在获取引用的是正确的DataContext对象。所选的图像路径是否与更改前的图像路径不同?是的,路径不同。一个快速问题,为什么StackPanel要加载图像列表?为什么不是ListView?这是设计要求吗?我之所以问您这个问题,是因为当您使用ListView时,您可以将所选项目数据上下文绑定到较大的图像,这样就消除了许多点击事件。看起来您是单击图像的源,而单击图像可能已经显示了图像。您确定要更改正确图像的imagesource吗?我不确定您在问什么。您是在问我是否只是简单地将相同的uri重新分配给大图像?我是在问您是否正在获取引用的是正确的DataContext对象。所选的图像路径是否与更改前的图像路径不同?是的,路径不同。一个快速问题,为什么StackPanel要加载图像列表?为什么不是ListView?这是设计要求吗?我之所以要求您这样做,是因为在使用ListView时,可以将所选项目数据上下文绑定到更大的图像,这样可以消除许多点击事件。我将尝试INotifyPropertyChanged。我不能使用“x:name”,因为它位于称为弹出型按钮的datatemplate中。我试过了,但它甚至在后面的代码中找不到名称。是的,我使用过
datatemplates
,这对他们来说是正确的。因此,在这种情况下,INotifyPropertyChanged是您的方法。[CallerMemberName]是将启动更改的函数的名称。但是它自己处理这个过程,你不必担心。@zachboy82如果有助于解决你的问题,请将答案标记为已接受,以便将来它可以帮助其他人。谢谢,我将尝试InotifyProperty更改。我不能使用“x:name”,因为它位于称为弹出型按钮的datatemplate中。我试过了,但它甚至在后面的代码中找不到名称。是的,我使用过
datatemplates
,这对他们来说是正确的。因此,在这种情况下,INotifyPropertyChanged是您的方法。[CallerMemberName]是将启动更改的函数的名称。但是它自己处理这个过程,你不必担心。@zachboy82如果有助于解决你的问题,请将答案标记为已接受,以便将来它可以帮助其他人。谢谢