0

我制作了 2 个数据模板并将其用作资源,我将其应用于列表框,我只能在列表框上应用一个数据模板,这是两个数据模板的代码

  <Window.Resources>
        <DataTemplate x:Key="template1">
            <Canvas Height="40" Width="850">
                <Label Height="30" Width="170" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label>
                <TextBox Height="30" Width="120" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox>
                <Label Canvas.Left="420" Canvas.Top="5">$</Label>
            </Canvas>
        </DataTemplate>
        <DataTemplate x:Key="template2">
            <Canvas Height="40" Width="850">
                <Label Height="30" Width="200" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label>
                <TextBox Height="30" Width="200" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox>
                <Label Canvas.Left="420" Canvas.Top="5">$</Label>
            </Canvas>
        </DataTemplate>
            </Window.Resources>

和列表框的代码

<TabItem>
        <Canvas Height="700" Width="850">
            <ListBox x:Name="listBox" Height="700" Width="850" ItemTemplate="{StaticResource template1}">
            </ListBox>
        </Canvas>
    </TabItem>

我如何将两个数据模板都应用到列表框,目前只有“模板1”被应用,如何应用“模板2”或者将来有很多数据模板。有什么办法吗??,thanx

4

2 回答 2

4

您是否尝试过 ItemsControl.ItemTemplateSelector 属性ItemTemplateSelector

下面我有一个绑定到 ListBox 的学生列表的非常简单的示例,对于分数低于 50% 的学生,我有 Template2,而对于其他人,我选择了 Template1

看法

<Window.Resources>
    <local:StudentDataTemplateSelector x:Key="studentDataTemplateSelector"/>
    <DataTemplate x:Key="template1">
        <StackPanel Orientation="Horizontal" Background="LightGray">
            <TextBlock Text="{Binding RollNo}" Margin="5"/>
            <TextBlock Text="{Binding Name}" Margin="5"/>
            <TextBlock Text="{Binding Percentage}" Margin="5"/>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="template2">
        <StackPanel Orientation="Horizontal" Background="Red">
            <TextBlock Text="{Binding RollNo}" Margin="5"/>
            <TextBlock Text="{Binding Name}" Margin="5"/>
            <TextBlock Text="{Binding Percentage}" Margin="5"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ListBox x:Name="listBox" Height="700" Width="850" ItemsSource="{Binding Students}"
             ItemTemplateSelector="{StaticResource studentDataTemplateSelector}">
    </ListBox>
</Grid>

xml.cs

 public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }    

ViewModel / 学生

    public class ViewModel
{
    public ObservableCollection<Student> Students { get; set; }

    public ViewModel()
    {
        Students = new ObservableCollection<Student>{new Student{Name="ABC",RollNo=1,Percentage=86.5m},
            new Student{Name="DEF",RollNo=2,Percentage=76.5m},
            new Student{Name="GHI",RollNo=3,Percentage=66.5m},
            new Student{Name="JKL",RollNo=4,Percentage=56.5m},
            new Student{Name="MNO",RollNo=5,Percentage=46.5m},
            new Student{Name="PQR",RollNo=6,Percentage=36.5m},
        };
    }

}

public class Student
{
    public string Name { get; set; }
    public int RollNo { get; set; }
    public decimal Percentage { get; set; }
}

项目模板选择器

    public class StudentDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        var student = item as Student;
        if (student == null)
            return null;
        if (student.Percentage > 50)
            return
                element.FindResource("template1")
                as DataTemplate;
        else
            return
                element.FindResource("template2")
                as DataTemplate;
    }
}

我希望这会给你一个想法。

于 2014-06-16T09:55:53.093 回答
1

您可以使用 DataTemplateSelector 和 Datatrigger 使用多个 DataTemplate,但您没有解释任何条件(选定项目、未选定项目、索引、更改前景和字体大小等)

似乎您只需要用于显示目的/UI 目的的模板,然后您需要为每个列表框项更改模板,如下所示

<Window.Resources>
    <ControlTemplate x:Key="template1">
        <Canvas Height="40" Width="850">
            <Label Height="30" Width="170" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label>
            <TextBox Height="30" Width="120" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox>
            <Label Canvas.Left="420" Canvas.Top="5">$</Label>
        </Canvas>
    </ControlTemplate>
    <ControlTemplate x:Key="template2">        
        <Canvas Height="40" Width="850">
            <Label Height="30" Width="200" Canvas.Top="5" Canvas.Left="80" Background="LightGray"></Label>
            <TextBox Height="30" Width="200" Canvas.Top="5" Canvas.Left="300" Background="AliceBlue"></TextBox>
            <Label Canvas.Left="420" Canvas.Top="5">$</Label>
        </Canvas>     
    </ControlTemplate>      
</Window.Resources>
<Grid>
    <TabControl>
        <TabItem>
            <Canvas Height="700" Width="850">
                <ListBox x:Name="listBox" Height="700" Width="850">
                    <ListBoxItem Template="{StaticResource template1}"></ListBoxItem>
                    <ListBoxItem Template="{StaticResource template2}"></ListBoxItem>
                </ListBox>
            </Canvas>
        </TabItem>
    </TabControl>
</Grid>
于 2014-06-16T09:43:57.977 回答