gpt4 book ai didi

c# - 为用户控件内的列表框设置项目模板

转载 作者:行者123 更新时间:2023-11-30 18:18:50 24 4
gpt4 key购买 nike

我在 UserControl 中有一个列表框来管理具有不同属性的不同实体。 UserControl 对于所有实体都是相同的。我使用 MVVM 并将通用 ViewModel 绑定(bind)为 UserControl 的 DataContext。我希望在 UserControl 的容器 xaml 中为列表框设置 ItemTemplate 以显示实体属性。对于实体“Emlployee”,我需要显示 FullName,对于实体 Certifying,我需要显示 CertifyingAuthor 和 CertifyingDate 等等。

我需要的是类似的东西

    <StackPanel Grid.Row="0" Orientation="Vertical">
<uc:SearchableFromListTextBox ItemTemplateForTheInsideListBox="{StaticResource Something}" ></uc:SearchableFromListTextBox>

我应该向 UserControl 添加一个 dependencyProperty ItemTemplateForTheInsideListBoxProperty 吗?我如何将它作为列表框的项目模板传递?

希望考虑到我的意大利母语,这个问题得到了很好的解释。谢谢

编辑:我放弃了。这是一个用于键盘数据输入的控件,类似于自动完成功能。因为我被迫同意与 MVVM 妥协 :( 我会选择一些肮脏的方式来解决。感谢大家

最佳答案

一个 DataTemplateSelector 可以做我认为你想要的。您可以从用户控件的 XAML 定义不同的模板,然后让选择器在其中进行选择。

假设这些模型类:

public class Employee
{
public Employee(string fullName)
{
FullName = fullName;
}

public string FullName { get; }
}

public class Certifying
{
public Certifying(string certifyingAuthor, DateTime certifyingDate)
{
CertifyingAuthor = certifyingAuthor;
CertifyingDate = certifyingDate;
}

public string CertifyingAuthor { get; }

public DateTime CertifyingDate { get; }
}

您的用户控件的 XAML 有一个 ListBox,它又使用一个模板选择器(我们稍后会介绍)——并且还为两种不同的模型类型定义了不同的模板:

<UserControl
x:Class="WPF.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF"
>
<Grid>
<ListBox x:Name="listBox">
<ListBox.ItemTemplateSelector>
<local:MyTemplateSelector>
<local:MyTemplateSelector.EmployeeTemplate>
<DataTemplate DataType="local:Employee">
<TextBlock
Foreground="Red"
Text="{Binding FullName}"
/>
</DataTemplate>
</local:MyTemplateSelector.EmployeeTemplate>
<local:MyTemplateSelector.CertifyingTemplate>
<DataTemplate DataType="local:Certifying">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Foreground="Blue"
Text="{Binding CertifyingAuthor}"
/>
<TextBlock
Grid.Column="1"
Foreground="Green"
Text="{Binding CertifyingDate}"
/>
</Grid>
</DataTemplate>
</local:MyTemplateSelector.CertifyingTemplate>
</local:MyTemplateSelector>
</ListBox.ItemTemplateSelector>
</ListBox>
</Grid>
</UserControl>

用户控件的代码隐藏,我只是将模型对象列表分配给列表框(为简单起见):

public partial class UserControl1
{
public UserControl1()
{
InitializeComponent();
listBox.ItemsSource = new List<object>
{
new Employee("Donald Duck"),
new Certifying("Mickey Mouse", DateTime.Now),
new Employee("Napoleon Bonaparte"),
new Certifying("Homer Simpson", DateTime.Now - TimeSpan.FromDays(2)),
};
}
}

最后,模板选择器。它的两个属性是从用户控件的 XAML 中设置的; SelectTemplate 的逻辑决定应用哪一个:

public class MyTemplateSelector : DataTemplateSelector
{
/// <summary>
/// This property is set from XAML.
/// </summary>
public DataTemplate EmployeeTemplate { get; set; }

/// <summary>
/// This property is set from XAML.
/// </summary>
public DataTemplate CertifyingTemplate { get; set; }

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Employee)
{
return EmployeeTemplate;
}

if (item is Certifying)
{
return CertifyingTemplate;
}

return base.SelectTemplate(item, container);
}
}

并且,为了完整起见,用户控件的使用:

<Grid>
<wpf:UserControl1 />
</Grid>

最终结果,当前选中拿破仑,鼠标悬停在荷马身上:

enter image description here

关于c# - 为用户控件内的列表框设置项目模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40426394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com