我正在尝试将我的元素绑定在字典中定义的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模板,我的实际案例比这更复杂。
感谢您的帮助
答案 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。