【问题标题】:How can I change the visibility of elements inside a DataTemplate when a row is selected in a Silverlight datagrid?在 Silverlight 数据网格中选择一行时,如何更改 DataTemplate 中元素的可见性?
【发布时间】:2010-03-24 05:43:27
【问题描述】:

我正在使用 MVVM 模式。我已经绑定了我的项目,我只想在数据网格中选择一行时显示编辑按钮。 WPF 中的触发器似乎是可能的,但我们在 Silverlight 中没有触发器。我尝试了 TemplatedParent 绑定,但我不确定在这种情况下 TemplatedParent 是什么。 Silverlight 中也没有 RelativeSource 祖先。在这一点上,我将使用背后的代码来看看一个解决方案......

<data:DataGrid.Columns>
   <data:DataGridTemplateColumn IsReadOnly="True" Header="Name" Width="300">
      <data:DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
            <Grid>
               <TextBlock x:Name="textBlock" Text="{Binding Name, Mode=OneWay}" VerticalAlignment="Center" Margin="4,4,0,4"/>
               <Button  Margin="1,1,4,1" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="7,4" Content="Edit" />
            </Grid>
         </DataTemplate>
       </data:DataGridTemplateColumn.CellTemplate>
   </data:DataGridTemplateColumn>
</data:DataGrid.Columns>

【问题讨论】:

    标签: silverlight datagrid mvvm datatemplate


    【解决方案1】:

    在silverlight 中有几种方法可以做到这一点,但我不认为它们中的任何一种都可以是纯XAML 解决方案。使用 MVVM,您可以在视图模型中创建绑定到 DataGrid 的 SelectedItem 属性的属性。从那里,有两种不同的选择:

    1. 如果 DataGird 中的各个项目本身是其他视图模型,那么您可以给它们一个属性,如“IsEditable”,并将其绑定到按钮的可见性。当父 ViewModel 的 SelectedItem 发生变化时,去更新所有子 ViewModel 的 IsEditable 属性
    2. 如果您没有子视图模型,您可以处理编辑按钮的加载事件。在后面的代码中,将按钮的可见性绑定到视图模型中的 selecteditem 属性,但还设置了一个绑定转换器,该转换器将原始绑定项作为转换器参数。在转换器中,您可以检查所选项目是否等于最初绑定的项目

    【讨论】:

    • 我选择了类似于选项 1 的方法。我在我的项目视图模型中添加了一个 IsSelected 属性(我有一个项目的 PagedCollectionView)。我使用 SelectionChanged 事件来遍历 e.RemovedItems 并清除选定的标志。 e.AddedItems 也是如此。我可能会考虑将 SelectedItem 添加到我的主视图模型中。如果有人走那条路,我认为最简单的方法是清除旧项目上 SelectedItem 设置器中的标志并在新 SelectedItem 上设置标志。
    【解决方案2】:

    如果 Silverlight 有一个 RelativeSource FindAncestor 绑定...

    我可以建议的一种 hacky 想法是将您的编辑控件放入 DataGrid 本身的 RowDetailsTemplate 中,然后将 RowDetailsVisibilityMode 设置为 VisibleWhenSelected。

    它可能不是您所追求的外观,但它可能“解决”您的特定用例。

    如果没有,那么我可能会在这里违反 MVVM(非常小心)。通常 DataGrids 是混蛋子边缘情况;他们几乎都需要一些各种代码隐藏。

    【讨论】:

    • 我考虑过使用 RowDetails 但你是对的..外观不是我想要的。不过建议不错。
    猜你喜欢
    • 2014-02-27
    • 2013-02-18
    • 2012-07-20
    • 2019-07-23
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多