【发布时间】:2016-03-06 01:03:25
【问题描述】:
如果我在数据模板中使用{x:Bind {RelativeSource Self}},编译时会出现以下错误:
对象引用未设置为对象的实例。
这个想法是将模板化的对象传递给一个属性,如命令参数。这是一个示例 MainPage.xaml:
<Page
x:Class="XBindTest5.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XBindTest5"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<ResourceDictionary>
<local:OpenItemCommand x:Key="OpenCommand"/>
</ResourceDictionary>
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ItemsControl ItemsSource="{x:Bind NewsItems, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:NewsItem">
<StackPanel>
<Button Command="{x:Bind {StaticResource OpenCommand}}" CommandParameter="{x:Bind {RelativeSource Self}}">
<TextBlock Text="{x:Bind Title}"/>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Page>
在代码隐藏文件MainPage.xaml.cs中定义了一个简单的模型:
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Windows.UI.Xaml.Controls;
namespace XBindTest5 {
public class NewsItem {
public string Title { get; set; }
}
/// <summary>
/// command to open the item
/// </summary>
public class OpenItemCommand : ICommand {
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter) {
return true;
}
public void Execute(object parameter) {
// ... example ...
}
}
public sealed partial class MainPage : Page {
public ObservableCollection<NewsItem> NewsItems { get; set; }
= new ObservableCollection<NewsItem>(new[] {
new NewsItem() { Title = "Item 1" },
new NewsItem() { Title = "Item 2" } });
public MainPage() {
this.InitializeComponent();
}
}
}
【问题讨论】:
-
如果您想知道为什么我将
command传递为StaticRessource:我没有找到通过X:Bind引用数据模板中的outer 属性的方法。使用静态资源也不起作用(创建另一个 NullReferenceException)。 -
对不起,你是对的。看看这个吧:stackoverflow.com/questions/32372073/…
-
哦,你是对的。答案是:RelativeSource (with x:Bind) 不受支持。所以我必须改变我的模型。我只搜索了
datatemplate,所以我错过了这个答案。 -
当您说“模板化对象”时,您是指模板在视觉上代表的视图模型吗?我想如果你只使用
{Binding},那应该可以。来自x:Bind的文档:“您不能将 {x:Bind} 与 Object 类型的 DataContext 属性一起使用,并且在运行时也会发生变化。”。 IE。任何依赖于运行时类型信息的技术(例如绑定到模板化对象)都无法与x:Bind一起使用。您需要转而使用{Binding}。 -
恕我直言,您自己应该以工作形式发布代码作为答案,然后自行接受答案。还包括文档和解释中的引用。这将提供未来读者需要的信息,并清楚地将问题标记为已回答。我不愿自己发布答案,因为(正如我所提到的)我还没有升级到 VS2015,因此我自己实际上无法测试任何 UWP/Windows 10 代码;我确实相信您的说法,即使用
CommandParameter={x:Bind}可以按预期工作,但我会尽量确保我发布的任何答案都只包含我个人验证过的代码。
标签: c# winrt-xaml uwp