从DataTemplate UWP

时间:2015-12-17 10:55:17

标签: c# user-controls winrt-xaml dependency-properties uwp

我有 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 属性?

1 个答案:

答案 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.