XamlBindingHelper Class
XamlBindingHelper Class
有人可以举例说明 XamlBindingHelper
class 的使用概况吗?特别是 GetDataTemplateComponent
和 SetDataTemplateComponent
方法。
官方document里面说
This class is for use in code that is generated by the XAML compiler.
这告诉我,我应该能够在 x:Bind
的代码生成的 classes (.g.cs
) 中找到它的一些引用,前提是没有一个线程解释其具体作用的互联网。
所以我创建了一个带有 ListView
的测试 UWP 项目,并在其 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
的增量项目呈现的关键功能,有助于改善整体 panning/scrolling 体验。
因此,除了 x:DeferLoadingStrategy
和 x:Load
(Creators Update)之外,它们还可以用来提高您的应用程序性能。
IDataTemplateComponent & IDataTemplateExtension
但是,我找不到与 GetDataTemplateComponent
和 SetDataTemplateComponent
相关的任何内容。我什至尝试在 XAML 中手动设置此附加 属性 但 get 方法总是返回 null
.
这是有趣的一点。后来在生成的class.
中找到了这段代码
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
,它是我的 ListView
的 ItemTemplate
中的根 Grid
,以及一个 IDataTemplateExtension
; where the latter takes an element and an IDataTemplateComponent
。如果你看一下它们的定义,它们的功能非常相似,这让我想到 DataTemplate.SetExtensionInstance
是不是 XamlBindingHelper.SetDataTemplateComponent
的替代品?我很想知道是否有其他情况。
与 IDataTemplateComponent
不同,您 可以 在您的代码中获取 IDataTemplateExtension
的实例 -
var firstItemContainer = (ListViewItem)MyListView.ContainerFromIndex(0);
var rootGrid = (Grid)firstItemContainer?.ContentTemplateRoot;
var dataTemplateEx = DataTemplate.GetExtensionInstance(rootGrid);
在我的例子中,dataTemplateEx
是另一个生成的 class 的实例,称为 MainPage_obj2_Bindings
,您可以在其中访问 ResetTemplate
和 [=46= 等方法].
我认为如果您要构建自己的自定义列表控件,它们可能会有所帮助,但除此之外,我不明白您为什么需要它们。
有人可以举例说明 XamlBindingHelper
class 的使用概况吗?特别是 GetDataTemplateComponent
和 SetDataTemplateComponent
方法。
官方document里面说
This class is for use in code that is generated by the XAML compiler.
这告诉我,我应该能够在 x:Bind
的代码生成的 classes (.g.cs
) 中找到它的一些引用,前提是没有一个线程解释其具体作用的互联网。
所以我创建了一个带有 ListView
的测试 UWP 项目,并在其 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
的增量项目呈现的关键功能,有助于改善整体 panning/scrolling 体验。
因此,除了 x:DeferLoadingStrategy
和 x:Load
(Creators Update)之外,它们还可以用来提高您的应用程序性能。
IDataTemplateComponent & IDataTemplateExtension
但是,我找不到与 GetDataTemplateComponent
和 SetDataTemplateComponent
相关的任何内容。我什至尝试在 XAML 中手动设置此附加 属性 但 get 方法总是返回 null
.
这是有趣的一点。后来在生成的class.
中找到了这段代码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
,它是我的 ListView
的 ItemTemplate
中的根 Grid
,以及一个 IDataTemplateExtension
; where the latter takes an element and an IDataTemplateComponent
。如果你看一下它们的定义,它们的功能非常相似,这让我想到 DataTemplate.SetExtensionInstance
是不是 XamlBindingHelper.SetDataTemplateComponent
的替代品?我很想知道是否有其他情况。
与 IDataTemplateComponent
不同,您 可以 在您的代码中获取 IDataTemplateExtension
的实例 -
var firstItemContainer = (ListViewItem)MyListView.ContainerFromIndex(0);
var rootGrid = (Grid)firstItemContainer?.ContentTemplateRoot;
var dataTemplateEx = DataTemplate.GetExtensionInstance(rootGrid);
在我的例子中,dataTemplateEx
是另一个生成的 class 的实例,称为 MainPage_obj2_Bindings
,您可以在其中访问 ResetTemplate
和 [=46= 等方法].
我认为如果您要构建自己的自定义列表控件,它们可能会有所帮助,但除此之外,我不明白您为什么需要它们。