2017-07-03 15 views
0

有人可以通过示例提供XamlBindingHelper类的使用概述吗?具体为GetDataTemplateComponentSetDataTemplateComponent方法。XamlBindingHelper类

+0

检查:https://www.bing.com/search?q=XamlBindingHelper+&qs=n&form=QBRE&sp=-1&pq=xamlbindinghelper+&sc=2-18&sk=&cvid=1B14A2054D2A4BE795829F474983B627 –

+2

@QualityCatalyst我没有,我没有没有找到例子。 – Luker

+1

正如文档所述**此方法用于由XAML编译器生成的代码** – Scavenger

回答

2

在官方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:DeferLoadingStrategyx:Load创作者更新)外,他们是别的东西可以用来提高你的应用程序的性能。


IDataTemplateComponent & IDataTemplateExtension

但是,我找不到相关GetDataTemplateComponentSetDataTemplateComponent什么。我甚至尝试在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这是我的ListViewItemTemplate内的根Grid,以及IDataTemplateExtension;后者需要一个元素和一个IDataTemplateComponent。如果你看看他们的定义,他们的功能是非常相似的,这让我觉得如果DataTemplate.SetExtensionInstanceXamlBindingHelper.SetDataTemplateComponent的替代?否则我很想知道。

不像IDataTemplateComponent,你可以在代码中得到IDataTemplateExtension的实例 -

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

在我的情况下,dataTemplateEx是叫MainPage_obj2_Bindings另一个生成的类,在这里您可以访问方法的一个实例如ResetTemplateProcessBindings

我假设他们可能会有所帮助,如果你要建立自己的自定义列表控件,但除此之外,我只是不明白你为什么需要它们。

+0

谢谢,这是一个很好的概述。 – Luker

+0

非常欢迎。我也从回答中学到了一些东西。 :) –