我想将用户控件(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>
这可能有什么问题?感谢。
答案 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>
希望这有助于指出问题所在的位置!