0

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

4

1 回答 1

2

在官方文件中,它说

此类用于由 XAML 编译器生成的代码。

这告诉我,我应该能够在代码生成的类 ( .g.cs) by中找到它的一些引用,x:Bind因为 Internet 上没有一个线程可以解释它的确切作用。

所以我创建了一个测试 UWP 项目ListViewItemTemplate其中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:DeferLoadingStrategyx:Load创作者更新)之外,它们还可以用来提高您的应用程序性能。


IDataTemplateComponent & IDataTemplateExtension

但是,我找不到与GetDataTemplateComponentand相关的任何内容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。它需要element2which 是my和 anGrid内部的根。后者需要一个元素和一个. 如果您查看它们的定义,它们的功能非常相似,这让我想如果是替换? 如果不是这样,我很想知道。ItemTemplateListViewIDataTemplateExtensionIDataTemplateComponentDataTemplate.SetExtensionInstanceXamlBindingHelper.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

如果您要构建自己的自定义列表控件,我认为它们可能会有所帮助,但除此之外,我就是看不出您为什么需要它们。

于 2017-07-04T09:20:25.633 回答