我有 FlipView ,显示小雕像。小雕像在其图像中包含 Path 。
将此属性绑定到常规DataTemplate即可。 (下面的代码工作正常)
</DataTemplate>
<Canvas x:Name="DefaultImageCanvas" Width="660" Height="372">
<Image Name="imageFlip" Width="660" Height="372" Source="{Binding Path}"
Stretch="Uniform" />
</Canvas>
</DataTemplate>
但是当使用我的UserControl时,它不再起作用了:
<DataTemplate>
<local:FigurineStickerUserControl Width="660" Height="372"
FigurinePath="{Binding Path}"/>
</DataTemplate>
从未设置过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对象)
<local:FigurineStickerUserControl Width="660" Height="372"
FigurinePath="{Binding SelectedItem.Path, ElementName=FlipFigurine}"/>
它不起作用。即使将DP更改为对象并尝试以下操作也不起作用,DP的设置器永远不会被调用。但是日志中没有错误。
FigurinePath="{Binding SelectedItem, ElementName=FlipFigurine}"
有没有办法访问实际的Figurine对象并简单地将其 Path 属性绑定到我的UC的 FigurinePath 属性?
答案 0 :(得分:3)
由于没有 FindAncestor ,我认为你唯一的希望是做一点重构。这是一个样本,希望能让您了解如何解决这个问题:
https://github.com/mikoskinen/uwpusercontrolbinding/tree/master
以下是代码中的主要部分:
<强> MainPage.xaml中强>
<DataTemplate>
<local:MyUserControl Width="660" Height="372" FigurinePath="{Binding Path}"/>
</DataTemplate>
<强> MainPage.xaml.cs中强>
private ObservableCollection<MyUserControlVm> coll;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
coll = new ObservableCollection<MyUserControlVm>();
coll.Add(new MyUserControlVm("http://libcloud.readthedocs.org/en/latest/_images/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 强>
<Grid>
<Canvas Width="660" Height="372">
<Image Width="660" Height="372" Source="{Binding FigurinePath}" Stretch="Uniform" />
</Canvas>
</Grid>
<强> 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()
{
}
}
对于与该示例相关的一些参考,这里是article from Jerry Nixon.