从ItemsControl中的控制的datacontext获取值

时间:2017-03-22 14:30:18

标签: c# wpf data-binding wpf-controls

我确信这很荒谬,但却让我陷入了困境。

我是存储在列表中的控件集合,这些控件使用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;

1 个答案:

答案 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>

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