从DataTemplate UWP绑定UserControl DP

我有一个显示小雕像FlipView 。 小雕像包含其图像的路径

将此属性绑定到常规DataTemplate是可以的。 (以下代码工作正常)

     

但是当使用我的UserControl时,它不再起作用了:

    

从未设置过FigurinePath DP。 (如果我使用硬编码字符串,那很好。)这是输出中的错误:

错误:BindingExpression路径错误:’Com.Test.ViewModels.UserControl.FigurineStickerUserControlViewModel,eSmart.ViewModels,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’上找不到’Path’属性。 BindingExpression:Path =’Path’DataItem =’Com.Test.ViewModels.UserControl.FigurineStickerUserControlViewModel,Test.ViewModels,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’; target元素是’Com.Test.Views.FigurineStickerUserControl’(Name =’pageRoot’); target属性是’FigurinePath’(类型’对象’)

看起来DataTemplate尝试将Figurine分配为UserControl的DataContext,然后从我的UC的DataContext中检索属性。 但我的UC有自己的DataContext(它的ViewModel),我不想删除它。

不幸的是,对于WinRT / UWP,我没有使用Binding可以做的FindAncestor技巧。 我已经尝试过这个:( FlipFigurine是FlipView对象)

  

它不起作用。 即使将DP更改为对象并尝试以下操作也不起作用,DP的设置器永远不会被调用。 但是日志中没有错误。

 FigurinePath="{Binding SelectedItem, ElementName=FlipFigurine}" 

有没有办法访问实际的Figurine对象,只需将其Path属性绑定到我的UC的FigurinePath属性?

由于没有FindAncestor ,我认为你唯一的希望就是做一点重构 。 这是一个样本,希望能让您了解如何解决这个问题:

https://github.com/mikoskinen/uwpusercontrolbinding/tree/master

这是代码中的主要部分:

MainPage.xaml中

    

MainPage.xaml.cs中

 private ObservableCollection coll; protected override void OnNavigatedTo(NavigationEventArgs e) { coll = new ObservableCollection(); coll.Add(new MyUserControlVm("http://sofzh.miximages.com/c%23/azure.jpg")); coll.Add(new MyUserControlVm("http://www.nimbo.com/wp-content/uploads/windows-azure-logo-nimbo1.png")); this.Flip.ItemsSource = coll; base.OnNavigatedTo(e); } 

MyUserControl.xaml

      

MyUserControl.xaml.cs

 public sealed partial class MyUserControl : UserControl { public static readonly DependencyProperty FigurinePathProperty = DependencyProperty.Register( "FigurinePath", typeof (Uri), typeof (MyUserControl), new PropertyMetadata(default(Uri))); public Uri FigurinePath { get { return (Uri) GetValue(FigurinePathProperty); } set { SetValue(FigurinePathProperty, value); } } public MyUserControl() { this.InitializeComponent(); (this.Content as FrameworkElement).DataContext = this; } } 

MyUserControlVM.cs

 public class MyUserControlVm { public Uri Path { get; set; } public MyUserControlVm(string url) { Path = new Uri(url); } public void VmAction() { } } 

有关该示例的一些参考,这里是Jerry Nixon的一篇文章。