简体   繁体   中英

How to create a template with parameters in WPF?

I have 3 List views. They are very similar. The only difference is that their ItemsSource binds to different variables. Is there a way to create a template list view with unknown ItemsSource, and I can pass a parameter to fill that ItemsSource?

My code is something like this:

<ListView Name="View1" ItemsSource={"Binding Student1"}>
    <TextBlock Text={"Binding Name"}/>
</ListView>

<ListView Name="View2" ItemsSource={"Binding Student2"}>
    <TextBlock Text={"Binding Name"}/>
</ListView>

<ListView Name="View3" ItemsSource={"Binding Student3"}>
    <TextBlock Text={"Binding Name"}/>
</ListView>

Edit: I might have expressed my question in a wrong way. I would like to have a separate user control view called "StudentView":

<ListView ItemsSource=Parameter1>
    <TextBlock Text={"Binding Name"}/>
</ListView>

So that in my main window, I can do something like this:

<local:StudentView Parameter1={"Binding Student1"}/>

You are on the right track with thinking about templating

What you are looking for is something called a ControlTemplate.

Your ControlTemplate would then target the ListView control and use the key word TemplateBinding to pass through the ItemsSource binding from your ListView

You would look to add this as a window resource as shown below.

<Window.Resources>
    <ControlTemplate x:Key="ListViewTemplate" TargetType="ListView">
        <ListView ItemsSource="{TemplateBinding ItemsSource}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ControlTemplate>
</Window.Resources>

This would enable you to use this template on your ListView controls as shown below

<ListView Template="{StaticResource ListViewTemplate}" ItemsSource="{Binding PersonList}"/>
<ListView Template="{StaticResource ListViewTemplate}" ItemsSource="{Binding PersonList1}"/>
<ListView Template="{StaticResource ListViewTemplate}" ItemsSource="{Binding PersonList2}"/>

Hope this gives you what you were looking for

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM