从 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>

它可以准确地处理我想要的布局。不敢相信我之前错过了它。 [捂脸]