c# - 如何将用户控件作为 ListBoxItem

标签 c# .net wpf xaml

我想将用户控件 (View) 绑定(bind)到 ListBoxItem。 ListBox 绑定(bind)到 ViewModel 的集合。我已将 ListBox 的 ItemTemplate 设置为:

<ListBox.ItemTemplate>
     <DataTemplate>
           <View:ContactView/>     
     </DataTemplate>
 </ListBox.ItemTemplate>

但我得到的只是空白的 ListBoxItems。我可以点击它们,但没有任何视觉显示。我的 ContactView 代码非常简单:

<Border>
    <DockPanel>
        <StackPanel DockPanel.Dock="Right" Orientation="Vertical">
            <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
            <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
            <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock>
        </StackPanel>
    </DockPanel>
</Border>

这有什么问题吗?谢谢。

最佳答案

似乎与我的示例项目配合得很好:

窗口 1 XAML:

<Window x:Class="WpfApplication7.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication7="clr-namespace:WpfApplication7"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListBox x:Name="myListbox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <WpfApplication7:ContactView/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

ContactView XAML(不需要隐藏代码;)):

<UserControl x:Class="WpfApplication7.ContactView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Border>
        <DockPanel>
            <StackPanel DockPanel.Dock="Right" Orientation="Vertical">
                <TextBlock Text="{Binding Path=ContactFirstName, FallbackValue=FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
                <TextBlock Text="{Binding Path=ContactLastName, FallbackValue=LastName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>
                <TextBlock Text="{Binding Path=ContactNumber, FallbackValue=Number}" Margin="5, 0, 5, 0"></TextBlock>
            </StackPanel>
        </DockPanel>
    </Border>

</UserControl>

Window1 的隐藏代码:

public partial class Window1
{
    public Window1()
    {
        InitializeComponent();
        myListbox.ItemsSource = new[]
                                    {
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 1 },
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 2 },
                                        new Contact { ContactFirstName = "Stack", ContactLastName = "Overflow", ContactNumber = 3 },
                                    };
    }
}

public class Contact
{
    public string ContactFirstName { get; set; }
    public string ContactLastName { get; set; }
    public int ContactNumber { get; set; }
}

我认为您的问题在于 ItemsSource 中的项目。确保绑定(bind)到正确的属性。我的联系人对象具有正确的属性。也许您的 ItemsSource 中的对象具有不同的属性名称?或者这些对象是否具有 Contact 属性,其中包含您想要的属性?

如果您的 ItemsSource 对象中有一个 Contact 属性,您可以在 TextBlock 上使用如下绑定(bind)(注意圆点):

<TextBlock Text="{Binding Path=Contact.FirstName}" FontWeight="Bold" Margin="5, 0, 5, 0"></TextBlock>

希望这有助于确定您的问题所在!

关于c# - 如何将用户控件作为 ListBoxItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946261/

相关文章:

c# - 文件仅在第一个条件下写入

c# - c# win apps 中的用户控制和数据绑定(bind)

C# 作为第一门语言?

c# - 为什么 ServiceStack.Text 自定义反序列化设置不适用?

c# - 如何返回对尚不存在的对象的引用?

c# - 比较运算符性能 <= 对 !=

wpf - 如何从 WPF 中的子页面访问父窗口的控制?

c# - 有没有办法在 Entity Framework Core 中映射临时表?

c# - 在 C# 中,如果抛出未处理的异常,Finally block 是否会在 try、catch、finally 中执行?

wpf - 处理可编辑的分层数据/TreeView~DataGrid 混合