2015-12-17 3 views
4

У меня есть FlipView, который показывает Статуэтки. Фигурки содержат Путь к их изображению.Связывание с UserControl DP из DataTemplate UWP

Связывание этого свойства с обычным 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 никогда не устанавливается. (. Если я использую жёстко прописанную строку, его штраф) Здесь ошибка в выводе:

Error: BindingExpression path error: 'Path' property not found on 'Com.Test.ViewModels.UserControl.FigurineStickerUserControlViewModel, eSmart.ViewModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. BindingExpression: Path='Path' DataItem='Com.Test.ViewModels.UserControl.FigurineStickerUserControlViewModel, Test.ViewModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Com.Test.Views.FigurineStickerUserControl' (Name='pageRoot'); target property is 'FigurinePath' (type 'Object')

Похоже DataTemplate пытается присвоить Фигурка как DataContext моего UserControl, а затем получить имущество от мой DataContext UC. Но мой UC имеет свой собственный DataContext (его ViewModel), и я не хочу его удалять.

К сожалению, с WinRT/UWP нет трюков FindAncestor, которые я могу сделать с привязкой. Я уже пробовал это: (FlipFigurine быть объектом FlipView)

<local:FigurineStickerUserControl Width="660" Height="372" 
            FigurinePath="{Binding SelectedItem.Path, ElementName=FlipFigurine}"/> 

Это не работает. Даже изменение DP на объект и попытка выполнения следующих действий не работают, установщик DP никогда не вызывается. Однако ошибок в журнале нет.

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

Есть ли способ, чтобы получить доступ к реальному объекту Фигурки и просто связать его Пути свойства к FigurinePath свойства моей UC ??

ответ

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.

+0

Спасибо Микаэля! Я не нашел времени, чтобы проверить его, но похоже, что это единственный способ пойти, хотя я надеялся на более элегантный способ (через xaml). Просто деталь: у меня нет ничего связанного с ЦБ, и поскольку мы передаем Путь непосредственно VM, DP теперь бесполезен, не так ли? – jujujuijk

Смежные вопросы