DataGrid中使用“guard method”的行为不一致

时间:2011-11-17 20:35:59

标签: silverlight datagrid caliburn.micro

我有DataGrid与此类似:

<sdk:DataGrid ItemSource="ItemGroups">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button 
                            Content="Show Items" 
                            cal:Message.Attach="ShowItems($dataContext)" />
                    </StackPanel>
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
        <sdk:DataGridTextColumn Binding="{Binding Name}" Header="Name" />
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

在我的视图模型中,我有一个保护方法:

public bool CanShowItems(ItemGroup itemGroup)
    {
        return itemGroup.State == States.Active;
    }

在我目前的情况下,guard方法仅返回列表中第二项的 true

所有其他“ShowItems”按钮都应该被​​禁用。

然而,当我向下滚动DataGrid时,启用按钮不在视图中,另一个启用的按钮进入视图。不会同时显示两个启用的按钮。但是,同样只有一次调用guard方法返回 true

可能导致这种奇怪行为的原因是什么?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这可能是由于DataGrid和类似控件回收DataTemplate这一事实造成的。这会导致一些类似于您所描述的问题。一般来说,我会避免直接在行上放置操作。这可能会导致创建大量行为,尤其是在您拥有大量数据的情况下。您可能需要采用不同的方法。