如何在资源字典中绑定数据模板
How do I bind datatemplate in a resource dictionary
我正在尝试将我的元素绑定到字典中定义的数据模板中。
让我们简单点。
我有一个简单的class
public class A { public string Data {get;set} }
我有一个简单的视图,其中包含一个 ListBox,ItemSources 是一个列表 class A :
<ListBox ItemsSource="{Binding AList}">
关键是,当我直接在视图中定义 Itemplate 时,绑定有效:
<ListBox.ItemTemplate>
<DataTemplate >
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
</ListBox.ItemTemplate>
效果很好。
但是当我在资源字典中定义这个 ItemTemplate 时,绑定不起作用?
我该怎么做?
PS :这是一个简单的例子来解释我的问题,不要告诉我重写 toString 函数使其工作或使用 classe 模板,我的真实案例更多比这个复杂。
感谢帮助
在当前Window/UserControl等资源部分声明你的数据模板如下,然后通过静态资源声明引用:
<Window.Resources> For example...
<DataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
</Window.Resources>
<ListBox ItemTemplate="{StaticResource MyTemplate}" />
你给你的 DataTemplate
一个 Key
这样你就可以使用显式定义你的模板并重复使用你的模板。您还需要确保 ItemsControl
是加载字典的控件的子控件。
<DataTemplate x:Key="ADataTemplate">
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
<ListBox ItemsSource="{Binding YourItems}"
ItemTemplate="{StaticResource ADataTemplate}" />
注意:您可以在 ListBox
上使用隐式样式,但是这会将相同的样式应用于所有 ListBox
es。
新建一个Dictionary1.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="dataTemplate">
<StackPanel>
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</StackPanel>
</DataTemplate>
</ResourceDictionary>
在MainWindow.xaml中引用
<Window.Resources>
<ResourceDictionary Source="Dictionary1.xaml" />
</Window.Resources>
<ListBox Name="lst" ItemTemplate="{StaticResource dataTemplate}"></ListBox>
MainWindow.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
var observable = new ObservableCollection<Test>();
observable.Add(new Test("A"));
observable.Add(new Test("B"));
observable.Add(new Test("C"));
this.lst.ItemsSource = observable;
}
}
public class Test
{
public Test(string dateTime)
{
this.Data = dateTime;
}
public string Data { get; set; }
}
我正在尝试将我的元素绑定到字典中定义的数据模板中。 让我们简单点。
我有一个简单的class
public class A { public string Data {get;set} }
我有一个简单的视图,其中包含一个 ListBox,ItemSources 是一个列表 class A :
<ListBox ItemsSource="{Binding AList}">
关键是,当我直接在视图中定义 Itemplate 时,绑定有效:
<ListBox.ItemTemplate>
<DataTemplate >
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
</ListBox.ItemTemplate>
效果很好。
但是当我在资源字典中定义这个 ItemTemplate 时,绑定不起作用?
我该怎么做?
PS :这是一个简单的例子来解释我的问题,不要告诉我重写 toString 函数使其工作或使用 classe 模板,我的真实案例更多比这个复杂。
感谢帮助
在当前Window/UserControl等资源部分声明你的数据模板如下,然后通过静态资源声明引用:
<Window.Resources> For example...
<DataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
</Window.Resources>
<ListBox ItemTemplate="{StaticResource MyTemplate}" />
你给你的 DataTemplate
一个 Key
这样你就可以使用显式定义你的模板并重复使用你的模板。您还需要确保 ItemsControl
是加载字典的控件的子控件。
<DataTemplate x:Key="ADataTemplate">
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>
<ListBox ItemsSource="{Binding YourItems}"
ItemTemplate="{StaticResource ADataTemplate}" />
注意:您可以在 ListBox
上使用隐式样式,但是这会将相同的样式应用于所有 ListBox
es。
新建一个Dictionary1.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="dataTemplate">
<StackPanel>
<TextBlock Text="{Binding Data}" />
<Rectangle Fill="Red" Height="10" Width="10"/>
</StackPanel>
</DataTemplate>
</ResourceDictionary>
在MainWindow.xaml中引用
<Window.Resources>
<ResourceDictionary Source="Dictionary1.xaml" />
</Window.Resources>
<ListBox Name="lst" ItemTemplate="{StaticResource dataTemplate}"></ListBox>
MainWindow.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
var observable = new ObservableCollection<Test>();
observable.Add(new Test("A"));
observable.Add(new Test("B"));
observable.Add(new Test("C"));
this.lst.ItemsSource = observable;
}
}
public class Test
{
public Test(string dateTime)
{
this.Data = dateTime;
}
public string Data { get; set; }
}