MVVM嵌套数据绑定

时间:2010-10-21 13:35:26

标签: wpf binding mvvm-light

在使用具有ItemsSource的ItemsControl时,我在UserControl内部进行数据绑定时遇到了一些麻烦。我的Eventtrigger永远不会被调用。

我认为问题在于,当我在行中调用我的eventtrigger时:

<cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" />

它试图在CheckBoxes集合中找到已检查的事件,因为我已经设置了我的ItemsSource,而它应该在其父级中查找。我一直在寻找解决方案,但是它们似乎都没有用。

我的代码如下所示:

<Grid x:Name="layoutroot">
            <ItemsControl x:Name="itemcontrol" ItemsSource="{Binding CheckBoxes}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <s:SurfaceCheckBox Background="White" Foreground="White">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Checked">
                                    <cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </s:SurfaceCheckBox>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>

当我尝试以下代码时,它完全按预期工作:

<Grid x:Name="layoutroot">
    <s:SurfaceCheckBox Background="White" Foreground="White" Content="{Binding Content}" >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Checked">
                <cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </s:SurfaceCheckBox>
</Grid>

但是我确实需要在带有ItemsSource的itemControl中使用此行为。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

ItemsControl内部的绑定放在集合中的当前项目上。你需要做的是寻找父母,并从那里结束。

ItemsControl内试一试,替换MyUserControlName

<cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyUserControlName} }, Path=DataContext.Checked}" />