如何在资源字典中绑定数据模板

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 上使用隐式样式,但是这会将相同的样式应用于所有 ListBoxes。

新建一个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; }
    }