Класс 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
,
Я предполагаю, что они могут быть полезны, если вы создадите свои собственные элементы управления списками, но кроме этого я просто не понимаю, зачем они вам понадобятся.