WPF自定义控件本身工作,但不作为另一控件的一部分
本文关键字:控件 一部分 不作为 自定义控件 工作 WPF | 更新日期: 2023-09-27 18:25:08
我有一个WPF自定义控件,用于显示图像。
有一个列表视图绑定到数据库实体的可观察集合,该集合随后通过值转换器转换为图像。
当我将控件拖动到windows窗体项目上(使用WPF Host控件)时,当在列表后面分配可观察集合时,它可以完美地工作。我已经测试了这个,它更新正确,并做了我需要的一切。
然而
我希望有三个这样的控件来显示相关的图像,所以我创建了第二个控件,它只是将三个原始控件分组到一个堆栈面板中。
我为每个创建了一个方法来更新images属性。
public void ChangeSearchResults(List<ItemImage> items)
{
SearchResultsImageViewer.ItemImages = new ObservableCollection<ItemImage>(items);
}
然而,我根本无法让图像显示出来。
直接查看控件和将控件视为子控件之间似乎存在差异。
我很确定它不是winforms中的元素宿主,因为控件本身工作得很好。
有什么我没有意识到的吗?
这是列表视图的Xaml
<!-- Sets the template for the data to be displayed -->
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- Defines the actual image being displayed -->
<Image x:Name="ItemImageControl"
Width="100"
Height="200"
Margin="1"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Cursor="Hand"
Source="{Binding .,
Converter={StaticResource imageConverter}}" />
<TextBlock HorizontalAlignment="Center"
FontWeight="Bold"
Text="{Binding .,
Converter={StaticResource groupNameConverter}}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
EDIT-这是用户控件XAML
<UserControl x:Class="Project.CustomControls.ctrlImageCollection"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CustomControls="clr-namespace:Project.CustomControls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<StackPanel>
<CustomControls:ctrlImageViewer x:Name="ShortlistImageViewer" />
<CustomControls:ctrlImageViewer x:Name="SearchResultsImageViewer" />
<CustomControls:ctrlImageViewer x:Name="GroupImageViewer" />
</StackPanel>
</UserControl>
使用
...
Source={Binding ., Converter={StaticResource imageConverter}}" />
您绑定到当前UserControl。当您单独使用ListView时,它会绑定到包含ListView的UserControl,并且可以工作。
如果将ListView UserControl放入另一个UserControl,则其值将绑定到其父UserControl,而不是"拥有"UserControl。
试试这个:
转到ListView UserControl xaml.cs并将DataContext设置为其自身。
//...
DataContext = this;
//...