2016-12-15 51 views
1

我正在用xaml和c#编写一个UWP项目。我有一个右侧图像的堆叠面板,您可以点击图像,它会在堆叠面板左侧显示相关的较大图像。如何确保UI在点击时更新到正确的图像?

大图像初始设置为与加载页面时堆叠面板中第一个“小”图像有关的“大”图像,但是当您单击堆栈面板中的任何其他小图像时,大图像不更新。

整件事是一个放置在弹出窗口内的数据模板。对于“大”的形象有关的XAML是在这里:

<Border Background="White" Grid.Row="2"> 
    <Image Stretch="Uniform"> 
     <Image.Source> 
      <BitmapImage UriSource="{Binding SelectedImage}" /> 
     </Image.Source> 
    </Image> 
</Border> 

当点击小图片,它触发该图像的“螺纹”方法和方法是:

private void Image_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    var img = ((Windows.UI.Xaml.Controls.Image)sender).DataContext as obj 
    img.FlyoutContent.SelectedImage = new Uri(img.relatedPath); 
} 

我使用上面的代码最初设置图像,它的工作原理。点击小图标时,它不会改变大图像。

在调试中,当我点击堆叠面板中的小图像时,我在“图像轻敲”方法中断,我可以看到uri得到正确更新并且没有绑定错误。 UI永远不会改变。

我错过了什么?

谢谢 扎克

*附注:在“目标文件”仅仅是一个自定义类的由名字。

+0

它看起来有点像你设置的点击图片,这可能已经具备了图像的来源。你确定你正在更改正确图像的图像源吗? –

+0

我不确定你在问什么。你问我是否只是重新分配同一个uri到大图像? – zachboy82

+0

我在问,它是否是您正在获取引用的正确的DataContext对象。在改变它之前,SelectedImage路径与你正在改变的路径有什么不同? –

回答

0

对于Binding属性,您需要实现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)); 
    } 

} 

或者你使用的是Tapped事件,为什么不给你的XAML元素的x:name这个名字的图像源设置为您URi

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

CustomClass ab = new CustomClass();

ab.ImageLink = "code here";

+0

我会尝试INotifyPropertyChanged。我不能使用“x:name”,因为它位于作为弹出窗口调用的数据模板中。我尝试过,但它甚至不会在后面的代码中找到名称。 – zachboy82

+0

是的,我使用过'datatemplates',这对他们来说是真实的。所以在这种情况下INotifyPropertyChanged是你的方法。 – Ahmar

+0

[CallerMemberName]是将启动更改的函数的名称。但它处理程序本身,你不需要担心它。 – Ahmar