我确信这很荒谬,但却让我陷入了困境。
我是存储在列表中的控件集合,这些控件使用ItemsControl和wrapPanel动态添加到我的页面。 (这个位有效)
我希望这些控件根据页面的宽度动态调整大小。为此,我创建了一个IValueConverter,它采用了多个列和页面宽度,然后根据这个等式在wrappanel中设置itemwidth(这个工作)
但是,我还需要将一些控件设置为双倍或三倍宽度。这就是我挣扎的地方。我目前的情况如下。
<ItemsControl.Resources>
<core:DisplayPageValueConverter x:Key="DisplayPageValueconvert" A="4" />
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel>
<WrapPanel.ItemWidth>
<MultiBinding Converter="{StaticResource DisplayPageValueconvert}">
<Binding ElementName="Items"
Path="ActualWidth" />
<Binding Path="DataContext.WidthFactor" />
</MultiBinding>
</WrapPanel.ItemWidth>
</WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
在datacontext.widthfactor上,而不是将控件的datacontext添加到ItemsControl中,而是获取页面本身的datacontext。
如果有人知道如何使这项工作或替代解决方法,将非常感谢。
我也试过以下
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.Width>
<MultiBinding Converter="{StaticResource DisplayPageValueconvert}">
<Binding ElementName="Items"
Path="ActualWidth" />
<Binding Path="DataContext.WidthFactor" />
</MultiBinding>
</Grid.Width>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
然而,由于ItemSource中的项目已经是控件,因此会跳过此选项,并且在输出窗口中出现以下错误。
ItemTemplate和ItemTemplateSelector将被ItemsControl的容器类型的项目忽略;类型=&#39; MyControl&#39;
答案 0 :(得分:2)
首先,感谢mm8指出我是一个白痴(我的话不是他的),因为我试图设置wrappanel的ItemWidth,它会将每个项目的宽度设置为相同的值。
最后,我采用了我的第二种方法,并对其进行了修改,使其真正起作用。而不是在我的viewmodel中存储MyControl的集合,而是存储MyControlViewModel的集合。
现在我的xaml文件中有以下内容
<ItemsControl.Resources>
<core:DisplayPageValueConverter x:Key="DisplayPageValueconvert"
A="4" />
</ItemsControl.Resources>
<ItemsControl.ItemTemplate>
<DataTemplate>
<views:MyControl DataContext="{Binding}">
<views:MyControl.Width>
<MultiBinding Converter="{StaticResource DisplayPageValueconvert}">
<Binding ElementName="Items"
Path="ActualWidth" />
<Binding Path="WidthFactor" />
</MultiBinding>
</views:MyControl.Width>
</views:MyControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel DockPanel.Dock="Top"
VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
它处理我想要的布局。不敢相信我以前错过了它。 [捂脸]