C# XamlBindingHelper类

C# XamlBindingHelper类,c#,uwp,uwp-xaml,xbind,C#,Uwp,Uwp Xaml,Xbind,有人能提供一个使用XamlBindingHelper类的概述并举例说明吗?特别是GetDataTemplateComponent和SetDataTemplateComponent方法。在官方中,它说 此类用于XAML编译器生成的代码中 这告诉我,我应该能够通过x:Bind,在代码生成类(.g.cs)中找到它的一些引用,因为互联网上没有一个线程解释它的具体功能 因此,我创建了一个带有ListView的测试UWP项目,并在其ItemTemplate中加入了一些x:Bind和x:Phase。编译完项目

有人能提供一个使用
XamlBindingHelper
类的概述并举例说明吗?特别是
GetDataTemplateComponent
SetDataTemplateComponent
方法。

在官方中,它说

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

这告诉我,我应该能够通过
x:Bind
,在代码生成类(
.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
方法用于转换值。我已经知道这一点,因为我在最近的回答中使用了它


XamlBindingHelper.SuspendRenderingXamlBindingHelper.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);
}
方法
DataTemplate.SetExtensionInstance
看起来非常类似于
XamlBindingHelper.SetDataTemplateComponent
。它采用
element2
,它是我的
ListView
ItemTemplate
中的根
Grid
,以及一个;后者接受一个元素和一个元素。如果你看一下它们的定义,它们的功能非常相似,这让我想到如果
DataTemplate.SetExtensionInstance
取代了
XamlBindingHelper.SetDataTemplateComponent
?我很想知道是不是真的

IDataTemplateComponent
不同,您可以在代码中获得
IDataTemplateExtension
的实例-

var firstItemContainer = (ListViewItem)MyListView.ContainerFromIndex(0);
var rootGrid = (Grid)firstItemContainer?.ContentTemplateRoot;
var dataTemplateEx = DataTemplate.GetExtensionInstance(rootGrid);
在我的例子中,
dataTemplateEx
是另一个生成的名为
MainPage\u obj2\u Bindings
的类的实例,您可以在其中访问
ResetTemplate
ProcessBindings
等方法

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

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

这告诉我,我应该能够通过
x:Bind
,在代码生成类(
.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
方法用于转换值。我已经知道这一点,因为我在最近的回答中使用了它


XamlBindingHelper.SuspendRenderingXamlBindingHelper.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);
}
方法
DataTemplate.SetExtensionInstance
看起来非常类似于
XamlBindingHelper.SetDataTemplateComponent
。它采用
element2
,它是我的
ListView
ItemTemplate
中的根
Grid
,以及一个;后者接受一个元素和一个元素。如果你看一下它们的定义,它们的功能非常相似,这让我想到如果
DataTemplate.SetExtensionInstance
取代了
XamlBindingHelper.SetDataTemplateComponent
?我很想知道是不是真的

IDataTemplateComponent
不同,您可以在代码中获得
IDataTemplateExtension
的实例-

var firstItemContainer = (ListViewItem)MyListView.ContainerFromIndex(0);
var rootGrid = (Grid)firstItemContainer?.ContentTemplateRoot;
var dataTemplateEx = DataTemplate.GetExtensionInstance(rootGrid);
在我的例子中,
dataTemplateEx
是另一个生成的名为
MainPage\u obj2\u Bindings
的类的实例,您可以在其中访问
ResetTemplate
ProcessBindings
等方法


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

检查此项:@QualityCatalyst我有,我没有找到示例。正如文档所述,此方法用于XAML编译器生成的代码中。检查此项:@QualityCatalyst我有,我没有找到示例。正如文档所述,此方法用于XAML编译器生成的代码。谢谢,这是一个很好的概述。非常欢迎。我也从回答中学到了一些东西谢谢,这是一个很好的概述。非常欢迎。我也从回答中学到了一些东西