如何通过命令或转换器将 RowDetailsTemplate 绑定到 ViewModel 中的 bool 变量?

问题描述 投票:0回答:1

我想做那样的事情,但我不知道如何将 RowDetailsVisibilityMode 绑定到 MVVM 中 ViewModel 的 bool 变量。 当我选择行时,RowDetailsVisibility 会折叠,但如果我单击按钮 RowDetailsVisibility == Visibility

我忽略的事件,因为我不知道我是通过命令执行的(我从命令更改 ContentControl)

我尝试了转换器,但我不知道如何设置它

我的行详细信息模板

                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Foreground="White" Margin="16" Text="{Binding ContolPageName, Mode=TwoWay}"/>
                        </Grid>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>

这样的命令

        public void ExecuteEditDataGridFormatViewCommand(object obj)
        {

            if (!VisabilityRowDetailsTemplate)
            {
                CurrentChildsView = new DataGridFormatViewModel();
                //row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
                ContolPageName = "PANEL";
                VisabilityRowDetailsTemplate = true;
            }
            else
            {
                VisabilityRowDetailsTemplate = false;
            }
  
        }

c# wpf mvvm sharp
1个回答
0
投票

要以符合 MVVM 的方式显示

DataGrid
的行详细信息,您不需要视图模型参与。这没有多大意义,因为您不想根据某些数据相关条件而是根据按下按钮来显示详细信息。这纯粹是与视图相关的问题。

您可以使用路由命令并在代码隐藏中处理它们。

以下示例使用自定义路由命令。但是,您也可以选择使用预定义的路由命令。用法保持不变。

MainWindow.xaml.cs
定义路由命令、命令

CommandBinding.Executed
CommandBinding.CanExecute
处理程序并实现行详细信息可见性的切换。

partial class MainWindow : Window
{
  // For example, define the command on the MainWindow class
  public static RoutedCommand ShowDetailsCommand { get; } 
    = new RoutedCommand(nameof(ShowDetailsCommand), typeof(MainWindow));

  private void OnExecutedShowRowDetails(object sender, ExecutedRoutedEventArgs e)
  {       
    var dataGrid = (DataGrid)sender;
    var selectedItemContainer = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(dataGrid.SelectedItem);
    var toggleButton = (ToggleButton)e.OriginalSource;
    selectedItemContainer.DetailsVisibility = toggleButton!.IsChecked .GetValueOrDefault()
      ? Visibility.Visible 
      : Visibility.Collapsed;
  }

  private void OnCanExecuteShowRowDetails(object sender, CanExecuteRoutedEventArgs e)
    => e.CanExecute = true;
}

MainWindow.xaml
定义一个包含

ToggleButton
的专用列,用于切换行详细信息视图的可见性。

<DataGrid ItemsSource="{Binding DataGridItems}"
          RowDetailsVisibilityMode="Collapsed">
  <DataGrid.CommandBindings>
    <CommandBinding Command="{x:Static local:MainWindow.ShowDetailsCommand}"
                    Executed="OnExecutedShowRowDetails"
                    CanExecute="OnCanExecuteShowRowDetails" />
  </DataGrid.CommandBindings>

  <DataGrid.Columns>
    <DataGridTemplateColumn Header="Details">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <ToggleButton Command="{x:Static local:MainWindow.ShowDetailsCommand}"
                        Content="Show details" />
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>

  <DataGrid.RowDetailsTemplate>
    <DataTemplate DataType="local:DataGridItem">

      <!-- The TwoWay binding on the TextBlock.Text property is pointless -->
      <TextBlock Text="{Binding ContolPageName}" />
    </DataTemplate>
  </DataGrid.RowDetailsTemplate>
</DataGrid>
© www.soinside.com 2019 - 2024. All rights reserved.