WPF DataGrid DetailView切换可见性

时间:2017-10-05 22:40:43

标签: c# wpf mvvm datagrid

我在WPF应用程序中有一个DataGrid,我希望允许用户对网格中的选定项目执行操作。我在DataGrid的DetailRow中托管这些操作的控件。

当用户单击网格中的一行时,我展开它并显示控件。完成后,我希望他们能够再次单击该行以隐藏该详细信息行。我遇到的问题是我无法让WPF区分行上的点击(实际上是行详细信息的“标题”)和我所有控件所在的行详细信息区域。对于WPF,单击详细信息意味着单击该行,我的代码认为这是一个切换,因此它隐藏了该行。

我在代码隐藏中进行切换,但是我正在使用MVVM作为应用程序,所以如果我可以采用更加分离的方法,我很想知道。以下是一些示例代码:

ViewModel和Model:

n = 40;
%read images
A = double(imread('faces_training/1.pgm'));
f(:, :, 1) = A;
for j = 2:n
    f(:, :, j) = double(imread(['faces_training/',num2str(j),'.pgm']));
    A = A + f(:, :, j);
end
%calculate average
a = (1/n)*A;
%imshow(uint8(a))
for i = 1:n
%subtract from images
    x_vector(:, i) = reshape(f(:, :, i) - a, [], 1);
end
X = (1/sqrt(n))*x_vector;
%svd
[U S V] = svd(X);
B = reshape(U(:, 1), [size(a, 1) size(a, 2)]);
imshow(uint8(B))

查看:

namespace StackOverflow
{
    public class ViewModel
    {
        public ObservableCollection<MyClass> MyCollection { get; set; }

        public ViewModel()
        {
            MyCollection = new ObservableCollection<MyClass>
            {
                new MyClass(0, "Foo"),
                new MyClass(1, "Bar")
            };
        }
    }

    public class MyClass
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public MyClass(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }
}

代码隐藏

<Window x:Class="StackOverflow.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:StackOverflow"
    mc:Ignorable="d"
    Title="MainWindow"
    Height="350"
    Width="525">
<Window.Resources>
    <local:ViewModel x:Key='MyVM'></local:ViewModel>
</Window.Resources>
<Grid DataContext='{StaticResource MyVM}'>
    <DataGrid HorizontalAlignment='Center' Width='200' Margin='20'
              RowDetailsVisibilityMode='Collapsed'
              ItemsSource='{Binding MyCollection}'>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <EventSetter Event="UIElement.PreviewMouseLeftButtonDown"
                             Handler="OnRowLeftClicked" />
            </Style>

        </DataGrid.RowStyle>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <StackPanel Background='LightBlue' HorizontalAlignment='Center' Orientation='Horizontal' Height='100'>
                    <Button VerticalAlignment='Center'
                            HorizontalAlignment='Center'>Do stuff to this specific item</Button>
                </StackPanel>
            </DataTemplate>

        </DataGrid.RowDetailsTemplate>
    </DataGrid>

</Grid>

更新

这被标记为I need the Expand / Collapse for RowDetailsTemplate

的可能重复

虽然这是一个非常类似的问题,但另一个问题的解决方案涉及使用扩展器按钮作为数据网格中的列。我更愿意只是单击datagrid行的任何位置,具体取决于之前是否单击了行,展开或折叠详细信息窗格。作为备份,我会让用户左键单击以展开并右键单击以收缩,这就是我现在在项目中所做的事情。

0 个答案:

没有答案