UWP: привязка ElementName не работает в EntranceThemeTransition - PullRequest
1 голос
/ 13 февраля 2020

Вот мой код (это приложение uwp). Мне интересно, почему не работает вторая привязка {Binding ElementName=Items, Path=DataContext.IsStaggeringEnabled} и как это исправить?

MainPage.xaml:

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Page.DataContext>
        <local:MainViewModel />
    </Page.DataContext>

    <StackPanel Orientation="Vertical">
        <ItemsControl x:Name="Items"
                      ItemsSource="{Binding Items}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerTransitions>
                <TransitionCollection>
                    <EntranceThemeTransition IsStaggeringEnabled="{Binding ElementName=Items, Path=DataContext.IsStaggeringEnabled}" <!-- THIS IS NOT WORKING -->
                                             FromVerticalOffset="-20"
                                             FromHorizontalOffset="-20" />
                </TransitionCollection>
            </ItemsControl.ItemContainerTransitions>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>

        <Button Click="{x:Bind Redraw}">Redraw</Button>
    </StackPanel>
</Page>

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        public void Redraw()
        {
            DataContext = new MainViewModel();
        }
    }
}

MainViewModel.cs:

using GalaSoft.MvvmLight;
using System.Collections.ObjectModel;

namespace App1
{
    public class MainViewModel : ViewModelBase
    {
        public ObservableCollection<ItemViewModel> Items { get; set; } = new ObservableCollection<ItemViewModel>();

        public bool IsStaggeringEnabled { get; set; } = true;

        public MainViewModel()
        {
            for (var i = 0; i < 10; i++)
            {
                Items.Add(new ItemViewModel());
            }
        }
    }
}

ItemViewModel.cs:

using GalaSoft.MvvmLight;

namespace App1
{
    public class ItemViewModel : ViewModelBase
    {
        public static int Index = 0;
        public string Name { get; set; }

        public ItemViewModel()
        {
            Index++;
            Name = $"{Index}";
        }
    }
}

Недопустимая привязка:

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Возможно, переходы не так просто укладываются в дерево XAML, поэтому было бы невозможно получить доступ к элементу управления через ElementName. В качестве обходного пути попробуйте все равно использовать {x: Bind}.

<EntranceThemeTransition 
    IsStaggeringEnabled="{x:Bind ((local:MainViewModel)Items.DataContext).IsStaggeringEnabled, Mode=OneWay}"
    FromVerticalOffset="-20"
    FromHorizontalOffset="-20"/>
0 голосов
/ 14 февраля 2020

Может быть, вам нужно изменить способ создания ViewModel:

xaml.cs

public MainViewModel vm = new MainViewModel();
public MainPage()
{
    this.InitializeComponent();
    DataContext = vm;
}
public void Redraw()
{
    vm = new MainViewModel();
}

xaml

...
<EntranceThemeTransition IsStaggeringEnabled="{x:Bind vm.IsStaggeringEnabled,Mode=OneWay}"
                         FromVerticalOffset="-20"
                         FromHorizontalOffset="-20" />
...

Так что вы можете успешно связываться.

...