如何将用户控件作为ListBoxItem

时间:2010-05-31 22:30:30

标签: c# .net wpf xaml

我想将用户控件(View)绑定到ListBoxItem。 ListBox绑定到ViewModels的集合。我将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>

这可能有什么问题?感谢。

5 个答案:

答案 0 :(得分:1)

您的ContactView不是'继承'ItemTemplate的数据上下文。或者,相反,ContactView本身是,但“内部”控件是分开的。尝试:

<View:ContactView DataContext="{Binding Path=.}" />

Path=.是一个特殊的构造,意思是“当前元素”。你甚至可以将它简化为{Binding}我认为。

如果检查输出窗口,则应该有一堆错误说明没有为这些TextBlock绑定提供对象。

答案 1 :(得分:1)

您是否设置了ItemSource属性?

ItemsSource="{Binding}"

答案 2 :(得分:0)

使用绑定

<View:NameofControl DataContext="{Binding }" />

答案 3 :(得分:0)

ViewModels何时设置其属性?可能是Binding将所有值读取为null(在设置数据之前) - 然后在实际设置数据时不接收任何通知。

答案 4 :(得分:0)

似乎可以在我的示例项目中正常工作:

Window1 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中的项目。确保绑定到正确的属性。我的Contact对象具有正确的属性。也许您的ItemsSource中的对象具有不同的属性名称?或者这些对象是否具有联系人属性,该属性包含您想要的属性?

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

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

希望这有助于指出问题所在的位置!

相关问题