从 ItemsControl 中控件的数据上下文中获取值
get value from datacontext of control within an ItemsControl
我敢肯定这非常简单,但它让我陷入困境。
我是存储在列表中的控件集合,这些控件是使用 ItemsControl 和 wrapPanel 动态添加到我的页面的。 (这个位有效)
我希望这些控件根据页面宽度动态调整大小。为此,我创建了一个 IValueConverter,它采用多列和页面宽度,然后根据此等式设置包装面板中的项目宽度(有效)
但是,我还需要将一些控件设为双倍或三倍宽。这就是我挣扎的地方。我目前的情况如下。
<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 上,不是获取添加到 ItemsControl 的控件的数据上下文,而是获取页面本身的数据上下文。
如果有人知道实现此功能的方法或替代解决方法,我们将不胜感激。
我也试过以下方法
<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 中的项目已经是控件,并且我在输出中收到以下错误 window。
ItemTemplate 和 ItemTemplateSelector 对于已经属于 ItemsControl 容器类型的项目将被忽略;类型='MyControl'
首先,感谢 mm8 指出我是个白痴(我的话不是他的话),因为我试图设置 wrapppanel 的 ItemWidth,这会将每个项目的宽度设置为相同的值。
最后我采用了第二种方法,并对其进行了修改,使其真正起作用。我没有在我的视图模型中存储 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>
它可以准确地处理我想要的布局。不敢相信我之前错过了它。 [捂脸]
我敢肯定这非常简单,但它让我陷入困境。
我是存储在列表中的控件集合,这些控件是使用 ItemsControl 和 wrapPanel 动态添加到我的页面的。 (这个位有效)
我希望这些控件根据页面宽度动态调整大小。为此,我创建了一个 IValueConverter,它采用多列和页面宽度,然后根据此等式设置包装面板中的项目宽度(有效)
但是,我还需要将一些控件设为双倍或三倍宽。这就是我挣扎的地方。我目前的情况如下。
<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 上,不是获取添加到 ItemsControl 的控件的数据上下文,而是获取页面本身的数据上下文。
如果有人知道实现此功能的方法或替代解决方法,我们将不胜感激。
我也试过以下方法
<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 中的项目已经是控件,并且我在输出中收到以下错误 window。
ItemTemplate 和 ItemTemplateSelector 对于已经属于 ItemsControl 容器类型的项目将被忽略;类型='MyControl'
首先,感谢 mm8 指出我是个白痴(我的话不是他的话),因为我试图设置 wrapppanel 的 ItemWidth,这会将每个项目的宽度设置为相同的值。
最后我采用了第二种方法,并对其进行了修改,使其真正起作用。我没有在我的视图模型中存储 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>
它可以准确地处理我想要的布局。不敢相信我之前错过了它。 [捂脸]