有人可以通过示例提供XamlBindingHelper
类的使用概述吗?具体为GetDataTemplateComponent
和SetDataTemplateComponent
方法。XamlBindingHelper类
回答
在官方document,它说
这个类是在代码中使用的是由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近期的回答中使用了one。
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中手动设置此附加属性,但得到方法总是返回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
这是我的ListView
的ItemTemplate
内的根Grid
,以及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
。
我假设他们可能会有所帮助,如果你要建立自己的自定义列表控件,但除此之外,我只是不明白你为什么需要它们。
谢谢,这是一个很好的概述。 – Luker
非常欢迎。我也从回答中学到了一些东西。 :) –
- 1. 类扩展类与类类
- 2. 为什么称为“类类”的“类类”?
- 3. 类的子类超类
- 4. 类类型和NSObject类型
- 5. 类型类和子类型
- 6. 类型类和子类
- 7. Haskell类型类
- 8. 类类型
- 9. 的类型类
- 10. 分类分类。 。
- 11. 类图和类
- 12. 类和基类
- 13. 类枚举类
- 14. FlowDocument类.NET类
- 15. NG-类的类
- 16. 主类 - 子类
- 17. 子类为类
- 18. 递归类型类的子类中的类型类(或递归类型的类型)
- 19. 分类的分类
- 20. Java类和小类
- 21. 类型类和GADTs
- 22. 类ZipOutputStream的closeEntry()类
- 23. 类和具体类
- 24. java类中的类?
- 25. 接口类与类
- 26. 类(类型)检查
- 27. CSS类和子类
- 28. Java类接口类
- 29. 类别和子类
- 30. M类:或M类():?
检查:https://www.bing.com/search?q=XamlBindingHelper+&qs=n&form=QBRE&sp=-1&pq=xamlbindinghelper+&sc=2-18&sk=&cvid=1B14A2054D2A4BE795829F474983B627 –
@QualityCatalyst我没有,我没有没有找到例子。 – Luker
正如文档所述**此方法用于由XAML编译器生成的代码** – Scavenger