XAML [UWP]使用VisualState.StateTriggers切换数据网格行的可见性

a8jjtwal  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(154)

我正在UWP中使用DataGrid显示表。我希望使用VisualState.StateTriggers根据项源中的属性值切换行的可见性。

<Style x:Key="RowStyle" TargetType="controls:DataGridRow">
             <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                <VisualState>
                    <VisualState.StateTriggers>
                        <StateTrigger IsActive="{Binding Delete, Converter={StaticResource VisibilityToBoolConverter}}" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Property="Visibility" Value="Collapsed" />
                    </VisualState.Setters>
                    </VisualState.StateTriggers>
                </VisualState>
               </VisualStateGroup>
           </VisualStateManager.VisualStateGroups>
        </Style>

 <controls:DataGrid
                        x:Name="grid"
                        AutoGenerateColumns="False"
                        VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
                        RowStyle="{StaticResource RowStyle}"
                        Height="auto">
 </controls:DataGrid>

ItemSource是以下项的ObvervableCollection

public class StudentsList {
                  public int Id;
                  public string Name;
                  public bool IsDeleted;
}

我希望只使用VisualState.StateTriggers折叠或禁用IsDeleted为true的所有行。
谢谢。

1dkrff03

1dkrff031#

我建议你用另一种方式来做这件事,比如代码隐藏,这会更容易。
1.查找数据网格中的任意列
1.在目标Row所在的列中查找元素
1.根据在步骤3中找到的元素查找目标Row
1.更改可见性。
下面是简单的代码:

// get any column 
       DataGridColumn d =dataGrid1.Columns.ElementAt(0);
        //get the element which contains the item for the row
       TextBlock element =  d.GetCellContent(MyViewModel.Customers[0]) as TextBlock;
        // get target row
        DataGridRow ROW = DataGridRow.GetRowContainingElement(element);
        // change visibility
        ROW.Visibility = Visibility.Collapsed;

相关问题