UWP-XAML和C#-x:在ResourceDictionary中绑定数据模板

UWP-XAML和C#-x:在ResourceDictionary中绑定数据模板,c#,uwp,uwp-xaml,xaml-binding,C#,Uwp,Uwp Xaml,Xaml Binding,上下文:我正在编写一个UWP Twitter客户端。我的Tweet类的一个属性是名为istweet的bool-如果Tweet包含转发,则该属性设置为True 我想将其与x:Load一起使用,以便在我的UI中有条件地加载显示“@username retweeted”的额外行 我要离开这个例子: 这是我的XAML,它位于ResourceDictionary中: 我在为x:Load绑定的字段中添加了一个名为DebugThis的临时转换器,如下所示: public类调试此:IValueConver

上下文:我正在编写一个UWP Twitter客户端。我的Tweet类的一个属性是名为
istweet
的bool-如果Tweet包含转发,则该属性设置为True

我想将其与
x:Load
一起使用,以便在我的UI中有条件地加载显示“@username retweeted”的额外行

我要离开这个例子:

这是我的XAML,它位于ResourceDictionary中:


我在为x:Load绑定的字段中添加了一个名为DebugThis的临时转换器,如下所示:

public类调试此:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、字符串语言)
{
bool isetweet=(bool)值;
返回互联网;
}
公共对象转换回(对象值、类型targetType、对象参数、字符串语言)
{
抛出新的NotImplementedException();
}
}
我在这个问题上设置了一个断点,而且我甚至没有点击转换器,所以我猜我的XAML绑定出了问题。我已经三次检查了使用此DataTemplate的对象,每个对象都明确正确设置了
isNetweet
属性

ETA:我可以通过将以下内容添加到我的UI页面的XAML来获取
x:Bind
以加载绑定数据:


但是,现在如果我将新内容动态加载到UI中,
x:Bind
绑定不会呈现

例如:

您的App.xaml只是在您的ResourceDictionary的xaml部分进行合并,这就是您要求它做的所有事情

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Visuals.xaml"/> <!-- Only loads XAML -->
</ResourceDictionary.MergedDictionaries>

但是,当您在DataTemplates中使用x:Bind/x:Load时,会为您的类创建编译器生成的代码,并且这些代码永远不会被加载,因为您将ResourceDictionary作为松散的XAML而不是类加载

要将ResourceDictionary及其关联的编译器为x:load/x:Bind/生成的代码作为完整类加载,请将App.xaml中的上述代码替换为:

<ResourceDictionary.MergedDictionaries>
    <local:Visuals />
</ResourceDictionary.MergedDictionaries>


(此时
足以让它按您的需要工作。)

如果您已经在数据模板上设置了x:DataType,则不应该在其中使用x:Boolean强制转换(您完全需要这样才能工作)。否则,如果没有更大的样本(最好是整个DataTemplate标记),这看起来很好?(Fwiw,出于某些原因x:Load实际上会妨碍DataTemplates的性能,原因我还没有弄清楚)(顺便说一下……让datatemplate的每个实例声明它们自己的样式并不是最好的主意——您不妨一次又一次地这样做,然后保存它们)我的整个项目在这里是公开的:我的DataTemplate在ResourceDictionary中,我的DataType设置为使用DataTemplate的对象(Tweeter.Tweet2)。我最终在StackPanel中使用了Setter,因为我无法将页面级别的Setter应用于所讨论的StackPanel,尽管这可能只是我的一个迟钝……我只能说,在GitHub上的代码中,单击一条Tweet会在新刀片中打开该Tweet,并在新刀片中正确应用x:Load:/。另外,如果要在App.xaml中进行合并,请在App.xaml中替换当前的ResourceDictionary合并-不要在页面本身上进行合并。在页面上进行修改可能是您新问题的根源(现在存在冲突的ResourceDictionary,其中一个在技术上已损坏)-请参见下面我的答案。我想我可能没有在tweet文本的绑定中使用x:Load来推动我的上一次更改。但是,将我的MergedDictionaries部分移动到App.xaml修复了这个问题。这很有效!有什么区别?我猜是应用程序层在页面级包含ResourceDictionary?