我正在尝试将我的元素绑定到字典中定义的数据模板中。让我们让它变得简单。
我有一个简单的课程
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}" />