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



我正在尝试将我的元素绑定到字典中定义的数据模板中。让我们让它变得简单。

我有一个简单的课程

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

我有一个简单的视图,其中包含一个列表框,ItemSources是一个类A的列表:

<ListBox ItemsSource="{Binding AList}">

关键是,当我直接在视图中定义 Itemplate 时,绑定工作:

<ListBox.ItemTemplate>
   <DataTemplate >
      <TextBlock Text="{Binding Data}" />
      <Rectangle Fill="Red" Height="10" Width="10"/>
   </DataTemplate>
 </ListBox.ItemTemplate>

这很好用。

但是当我在资源字典中定义此项目模板时,绑定不起作用?

我该怎么做?

PS :这是一个解释我的问题的简单示例,不要告诉我覆盖toString函数以使其工作或使用classe模板,我的真实情况比这复杂得多。

感谢您的帮助

创建一个新的字典1.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>

主窗口.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; }
    }
您可以为

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

在当前窗口/用户控件等的"资源"部分中声明数据模板,如下所示,然后通过静态资源声明进行引用:

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

相关内容

  • 没有找到相关文章

最新更新