Класс XamlBindingHelper

Может ли кто-нибудь предоставить обзор использования XamlBindingHelper класс с примерами? В частности, GetDataTemplateComponent а также SetDataTemplateComponent метод.

1 ответ

Решение

В официальном документе говорится

Этот класс предназначен для использования в коде, который генерируется компилятором XAML.

Это говорит мне, что я должен быть в состоянии найти некоторую ссылку на это в сгенерированных кодом классах (.g.cs) от x:Bind Учитывая, что в Интернете нет ни одной темы, объясняющей, что именно она делает.

Поэтому я создал тестовый проект UWP с ListView и внутри его ItemTemplate Я бросил в некоторых x:Bind с x:Phase, После того, как я скомпилировал проект, я обнаружил, что некоторые из его методов используются внутри моего MainPage.g.cs -

XamlBindingHelper.ConvertValue

public static void Set_Windows_UI_Xaml_Controls_ItemsControl_ItemsSource(global::Windows.UI.Xaml.Controls.ItemsControl obj, global::System.Object value, string targetNullValue)
{
    if (value == null && targetNullValue != null)
    {
        value = (global::System.Object) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Object), targetNullValue);
    }
    obj.ItemsSource = value;
}

Видимо XamlBindingHelper.ConvertValue Метод для преобразования значений. Я знал это уже, поскольку я использовал это в одном из моих недавних ответов на SO.


XamlBindingHelper.SuspendRendering & XamlBindingHelper.ResumeRendering

public int ProcessBindings(global::Windows.UI.Xaml.Controls.ContainerContentChangingEventArgs args)
{
    int nextPhase = -1;
    switch(args.Phase)
    {
        case 0:
            nextPhase = 1;
            this.SetDataRoot(args.Item);
            if (!removedDataContextHandler)
            {
                removedDataContextHandler = true;
                ((global::Windows.UI.Xaml.Controls.StackPanel)args.ItemContainer.ContentTemplateRoot).DataContextChanged -= this.DataContextChangedHandler;
            }
            this.initialized = true;
            break;
        case 1:
            global::Windows.UI.Xaml.Markup.XamlBindingHelper.ResumeRendering(this.obj4);
            nextPhase = -1;
            break;
    }
    this.Update_((global::System.String) args.Item, 1 << (int)args.Phase);
    return nextPhase;
}

public void ResetTemplate()
{
    this.bindingsTracking.ReleaseAllListeners();
    global::Windows.UI.Xaml.Markup.XamlBindingHelper.SuspendRendering(this.obj4);
}

XamlBindingHelper.SuspendRendering & XamlBindingHelper.ResumeRendering выглядит очень интересно. Кажется, они являются ключевыми функциями для ListView / GridView Инкрементальный рендеринг элементов, который помогает улучшить общее панорамирование / прокрутку.

Так что кроме x:DeferLoadingStrategy а также x:Load (Обновление создателей), они могут использоваться для повышения производительности вашего приложения.


IDataTemplateComponent & IDataTemplateExtension

Тем не менее, я не мог найти ничего, связанного с GetDataTemplateComponent а также SetDataTemplateComponent, Я даже пытался вручную установить это свойство в XAML, но метод get всегда возвращался null,

И вот интересная часть. Позже я нашел этот кусок кода в сгенерированном классе.

case 2: // MainPage.xaml line 13
    {                    
        global::Windows.UI.Xaml.Controls.Grid element2 = (global::Windows.UI.Xaml.Controls.Grid)target;
        MainPage_obj2_Bindings bindings = new MainPage_obj2_Bindings();
        returnValue = bindings;
        bindings.SetDataRoot(element2.DataContext);
        element2.DataContextChanged += bindings.DataContextChangedHandler;
        global::Windows.UI.Xaml.DataTemplate.SetExtensionInstance(element2, bindings);
    }
    break;

Метод DataTemplate.SetExtensionInstance выглядит очень похоже на XamlBindingHelper.SetDataTemplateComponent, Занимает element2 который является корнем Grid внутри ItemTemplate из моего ListView и IDataTemplateExtension; где последний берет элемент и IDataTemplateComponent, Если вы посмотрите на их определения, их функции очень похожи, что заставляет меня задуматься, DataTemplate.SetExtensionInstance это замена XamlBindingHelper.SetDataTemplateComponent? Я хотел бы знать, если иначе.

В отличие от IDataTemplateComponent Вы можете получить экземпляр IDataTemplateExtension в вашем коде -

var firstItemContainer = (ListViewItem)MyListView.ContainerFromIndex(0);
var rootGrid = (Grid)firstItemContainer?.ContentTemplateRoot;
var dataTemplateEx = DataTemplate.GetExtensionInstance(rootGrid);

В моем случае dataTemplateEx это экземпляр другого сгенерированного класса с именем MainPage_obj2_Bindings где у вас есть доступ к таким методам, как ResetTemplate а также ProcessBindings,

Я предполагаю, что они могут быть полезны, если вы создадите свои собственные элементы управления списками, но кроме этого я просто не понимаю, зачем они вам понадобятся.

Другие вопросы по тегам