如何在资源字典中绑定datatemplate

时间:2015-04-21 15:43:28

标签: c# wpf styles

我正在尝试将我的元素绑定在字典中定义的datatemplate中。 让我们简单一点。

我有一个简单的课程

public class A { public string Data {get;set} }

我有一个包含ListBox的简单视图,ItemSources是一个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模板,我的实际案例比这更复杂。

感谢您的帮助

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

在当前Window / UserControl等的Resources部分中声明您的数据模板,如下所示,然后通过静态资源声明引用:

<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}" />

答案 2 :(得分:0)

您向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上使用隐式样式,但这会将相同的样式应用于所有{{1}} es。