How do I bind datatemplate in a resource dictionary

谁都会走 提交于 2019-12-22 06:41:16

问题


I'm trying to bind my elements in a datatemplate that is define in dictionary. Let's make it simple.

I have a simple class

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

I have a simple view that contains a ListBox, with ItemSources is a list of class A :

<ListBox ItemsSource="{Binding AList}">

The point is, when I define Itemplate in view directly, bind works :

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

This works great.

But when I define this ItemTemplate in resource Dictionary, binding doesn't works ?

How can I do that ?

PS : This is a simple example to explain my problem, don't tell me to override toString function to make it works or use classe template, my real case is very more complexe than this.

Thanks for help


回答1:


Create a new 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>

In MainWindow.xaml refer it

<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; }
    }



回答2:


You give your DataTemplate a Key so you can use explicitly define your template and reuse your template. You also need to make sure the ItemsControl is a child of the control which loads the dictionary.

<DataTemplate x:Key="ADataTemplate">
   <TextBlock Text="{Binding Data}" />
   <Rectangle Fill="Red" Height="10" Width="10"/>
</DataTemplate>

<ListBox ItemsSource="{Binding YourItems}"
         ItemTemplate="{StaticResource ADataTemplate}" />

Note: You can use implicit styling on ListBox, however that would apply the same style to all of your ListBoxes.




回答3:


Declare your data template in the Resources section of the current Window/UserControl etc as follows and then reference via static resource declaration:

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


来源:https://stackoverflow.com/questions/29776976/how-do-i-bind-datatemplate-in-a-resource-dictionary

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!