我在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行的任何位置,具体取决于之前是否单击了行,展开或折叠详细信息窗格。作为备份,我会让用户左键单击以展开并右键单击以收缩,这就是我现在在项目中所做的事情。