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.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);
}
方法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.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);
}
方法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编译器生成的代码。谢谢,这是一个很好的概述。非常欢迎。我也从回答中学到了一些东西谢谢,这是一个很好的概述。非常欢迎。我也从回答中学到了一些东西