Items Controls
이 컨트롤에는 단일 콘텐츠가 아닌 무제한 컬렉션이 포함될 수 있습니다. 모든 항목 컨트롤은 ContentControl과 마찬가지로 Control의 직접 하위 클래스 인 추상 ItemsControl 클래스에서 파생됩니다. ItemsControl은 해당 내용을 ItemCollection 유형의 Items 속성에 저장합니다. 각 항목은 기본적으로 콘텐츠 컨트롤 내에서 렌더링되는 것과 마찬가지로 렌더링되는 임의의 개체가 될 수 있습니다. 즉, 모든 UIElement가 예상대로 렌더링되고 다른 형식은 (데이터 템플릿 무시) ToString 메서드에서 반환 된 문자열을 포함하는 TextBlock로 렌더링됩니다.
|
임의의 개체가 Item으로 설정 가능 |
공통 기능
Items 및 ItemsSource 외에도 ItemsControl에는 다음과 같은 몇 가지 추가 흥미로운 속성이 있습니다.
. HasItems - 선언적 XAML에서 컨트롤의 빈 상태를 쉽게 처리 할 수 있도록하는 읽기 전용 부울 속성입니다. C #에서이 속성을 사용하거나 단순히 Items.Count의 값을 확인할 수 있습니다.
. IsGrouping - 컨트롤의 항목이 최상위 그룹으로 나뉘어져 있는지 여부를 알려주는 읽기 전용 부울 속성입니다. 이 그룹은 항목 그룹을 관리하고 이름을 지정하기위한 여러 속성을 포함하는 ItemsCollection 클래스에서 직접 수행됩니다.
. AlternationCount 및 AlternationIndex - 이 속성 쌍은 해당 인덱스를 기반으로 항목 스타일을 쉽게 바꿀 수 있습니다. 예를 들어 AlternationCount를 2로 설정하면 짝수 색인 항목에 하나의 스타일을, 홀수 색인 항목에 다른 스타일을 제공 할 수 있습니다.
. DisplayMemberPath- 각 개체가 렌더링되는 방식을 변경하는 각 항목의 속성 이름 (또는 더 복잡한 표현식)으로 설정할 수있는 문자열 속성입니다.
. ItemsPanel- 전체 컨트롤 템플릿을 바꾸지 않고 컨트롤의 항목을 정렬하는 방법을 사용자 지정하는 데 사용할 수있는 속성입니다.
DisplayMemberPath
ListBox의 DisplayMemberPath 속성을 DayOfWeek로 설정 했을 경우 각 항목의 DayOfWeek 속성 값을 렌더링 하라고 지시합니다. DayOfWeek 속성을 가지고 있는 DateTime 타입의 아이템은 요일로 렌더링 됩니다.(DayOfWeek 속성의 ToString 기반 렌더링) Button 및 Expander는 DayOfWeek 속성이 없기에 렌더링 되지 않습니다.
|
DayOfWeek 속성을 가진 타입의 렌더링 |
ItemsPanel
ItemsPanel이라는 미니 템플릿을 사용하면 항목을 배열하는 데 사용 된 패널을 교체 할 수 있으며 제어 도구에 대한 다른 모든 항목은 그대로 유지합니다.
예를 들어 ListBox는 기본적으로 항목을 세로로 쌓습니다. 그러나 다음 XAML에서는이 배열을 WrapPanel로 바꿉니다.
1: <Window x:Class="ItemsControls.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:ItemsControls"
7: xmlns:sys="clr-namespace:System;assembly=mscorlib"
8: mc:Ignorable="d"
9: Title="MainWindow" Height="350" Width="525">
10: <Grid>
11: <ListBox>
12: <ListBox.ItemsPanel>
13: <ItemsPanelTemplate>
14: <WrapPanel />
15: </ItemsPanelTemplate>
16: </ListBox.ItemsPanel>
17: <Button>Button</Button>
18: <Expander Header="Expander" />
19: <sys:DateTime>1/1/2018</sys:DateTime>
20: <sys:DateTime>1/2/2018</sys:DateTime>
21: <sys:DateTime>1/3/2018</sys:DateTime>
22: </ListBox>
23: </Grid>
24: </Window>
|
WrapPanel 적용 화면 |
많은 항목 컨트롤은 좋은 성능을 얻기 위해 기본 ItemsPanel로 VirtualizingStackPanel을 사용합니다. WPF 4에서 이 패널은 스크롤링 성능을 더욱 향상시키는 새로운 모드를 지원하지만 명시 적으로 켜야합니다. 이렇게하려면 VirtualizingStackPanel.VirtualizationMode 연결된 속성을 재활용으로 설정합니다. 이 작업이 완료되면 패널은 각 항목에 대한 새 컨테이너를 구성하는 대신 각 화면 항목을 보유하는 컨테이너를 재사용 합니다.
Selectors
선택기는 항목을 인덱싱 할 수 있고 가장 중요한 항목을 선택할 수있는 항목 컨트롤입니다. ItemsControl에서 파생 된 추상 Selector 클래스는 선택을 처리 할 수있는 몇 가지 속성을 추가합니다. 예를 들어, 다음은 현재 선택 항목을 가져 오거나 설정하는 세 가지 유사한 속성입니다.
- SelectedIndex - 선택된 항목을 나타내는 0부터 시작하는 정수 또는 아무것도 선택하지 않은 경우 -1입니다. 항목은 컬렉션에 추가 된 순서대로 번호가 매겨집니다.
- SelectedItem - 현재 선택된 실제 항목 인스턴스입니다.
- SelectedValue - 현재 선택한 항목의 값입니다. 기본적으로이 값은 SelectedValue를 SelectedItem과 동일하게 만드는 항목 자체입니다. 그러나 SelectedValuePath를 설정하여 각 항목의 값을 나타내는 임의의 속성이나 표현식을 선택할 수 있습니다. SelectedValuePath는 DisplayMemberPath와 똑같이 작동합니다.
세 가지 속성은 모두 읽기 / 쓰기가 가능하므로 현재 선택 영역을 변경하고 검색하는 데 사용할 수 있습니다. 또한 Selector는 개별 항목에 적용 할 수있는 두 개의 연결된 속성을 지원합니다.
- IsSelected - 항목을 선택 또는 선택 해제하거나 현재 선택 상태를 검색하는 데 사용할 수있는 부울입니다.
- IsSelectionActive - 선택 영역에 포커스가 있는지 여부를 나타내는 읽기 전용 부울입니다.
또한 Selector는 SelectionChanged 이벤트를 정의하여 현재 선택 항목의 변경 사항을 수신 할 수 있도록합니다. WPF는 5 개의 Selector 파생 컨트롤을 제공합니다.
- ComboBox
- ListBox
- ListView
- TabControl
- DataGrid
ComboBox
ComboBox는 두 개의 이벤트 (DropDownOpened 및 DropDownClosed)와 속성 (IsDropDownOpen)을 정의하여 열거 나 닫히는 드롭 다운에 대해 작업 할 수있게합니다. 예를 들어, DropDownOpened 이벤트를 처리하여 드롭 다운을 열 때까지 ComboBox 항목의 채우기를 지연시킬 수 있습니다. IsDropDownOpen은 읽기 / 쓰기 속성이므로 드롭 다운 상태를 직접 변경하여 설정할 수 있습니다.
ComboBox는 사용자가 선택 상자에 임의의 텍스트를 입력 할 수있는 모드를 지원합니다. 텍스트가 기존 항목 중 하나와 일치하면 해당 항목이 자동으로 선택됩니다. 그렇지 않으면 아무 항목도 선택되지 않지만 사용자 지정 텍스트는 ComboBox의 Text 속성에 저장되어 적절하게 처리 할 수 있습니다. 이 모드는 적절하게 이름이 지정되지 않은 두 개의 IsEditable 및 IsReadOnly 속성을 사용하여 제어 할 수 있으며 기본값은 false입니다. 또한 StaysOpenOnEdit 속성을 true로 설정하여 사용자가 선택 상자를 클릭하면 드롭 다운을 열어 둘 수 있습니다
IsEditable 속성이 true로 설정 되어 있을 경우, 아이템 항목을 선택 했을 때 "System.Windows.Controls.StackPanel" 형식 이름을 선택 상자에 사용할 수 없음으로 TextSearch 클래스가 제공 됩니다.
ListBox
ListBox 컨트롤은 ComboBox와 비슷하지만 컨트롤의 경계 내에 모든 항목이 직접 표시됩니다 (또는 모두 맞지 않는 경우 추가 항목을 보려면 스크롤 할 수 있음).
ListBox의 가장 중요한 기능은 여러 개의 동시 선택을 지원할 수 있다는 것입니다. 이 컨트롤은 SelectionMode 열거 형에서 세 개의 값을 받아들이는 SelectionMode 속성을 통해 제어 할 수 있습니다.
- Single - ComboBox와 마찬가지로 한 번에 하나의 항목 만 선택할 수 있습니다. 이것은 기본값입니다.
- Multiple - 동시에 여러 항목을 선택할 수 있습니다. 선택되지 않은 항목을 클릭하면 ListBox의 SelectedItems 컬렉션에 추가되고 선택한 항목을 클릭하면 컬렉션에서 제거됩니다.
- Extended - 여러 항목을 동시에 선택할 수 있지만 동작은 단일 선택의 경우에 최적화됩니다. 이 모드에서 여러 항목을 선택하려면 Shift 키 (인접 항목의 경우) 또는 Ctrl (인접하지 않은 항목의 경우)를 누른 채로 클릭해야합니다. 이것은 Win32 ListBox 컨트롤의 동작과 일치합니다.
ListView
ListBox에서 파생 된 ListView 컨트롤은 기본적으로 Extended SelectionMode를 사용한다는 점을 제외하고는 ListBox처럼 보이고 작동합니다. 그러나 ListView에는 View라는 속성이 추가되어 사용자 정의 ItemsPanel을 선택하는 것보다 더 풍부한 방식으로보기를 사용자 정의 할 수 있습니다. View 속성은 추상 클래스 인 ViewBase 유형입니다.
TabControl
TabControl은 여러 페이지의 내용을 전환하는 데 유용합니다. TabControl의 탭은 일반적으로 상단에 배치되지만 TabControl의 TabStripPlacment 속성 (Dock 유형)을 사용하여 배치를 왼쪽, 오른쪽 또는 아래쪽으로 설정할 수도 있습니다. TabItem을 명시 적으로 사용하지 않으면 해당 탭에 레이블을 지정할 수 없으며, TabItem은 헤더가있는 콘텐츠 컨트롤이므로 Header는 GroupBox 또는 Expander와 마찬가지로 임의의 개체가 될 수 있습니다.
TabItem을 사용하여 다른 선택기와 달리 첫 번째 항목이 기본적으로 선택됩니다. 그러나 SelectedItem을 null 또는 SelectedIndex를 -1로 설정하여 프로그래밍 방식으로 모든 탭의 선택을 취소 할 수 있습니다.
DataGrid
DataGrid는 여러 열의 데이터 행을 표시하고 정렬하고 편집 할 수있는 다양한 컨트롤입니다. 메모리 내 데이터베이스 테이블 (예 : ADO.NET의 System.Data.DataTable)에 쉽게 연결될 수 있도록 최적화되어 있습니다. 사용자 정의 레코드 유형의 두 인스턴스에 대한 XAML로 인스턴스화 된 컬렉션을 직접 포함하는 DataGrid를 예제로 확인해 보겠습니다.
1: <Window x:Class="DataGrid.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:DataGrid"
7: xmlns:sys="clr-namespace:System;assembly=mscorlib"
8: mc:Ignorable="d"
9: Title="MainWindow" Height="350" Width="525">
10: <Grid>
11: <DataGrid IsReadOnly="True">
12: <!-- Support for showing all genders in the DataGridComboBoxColumn: -->
13: <DataGrid.Resources>
14: <ObjectDataProvider x:Key="genderEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
15: <ObjectDataProvider.MethodParameters>
16: <x:Type Type="local:Gender" />
17: </ObjectDataProvider.MethodParameters>
18: </ObjectDataProvider>
19: </DataGrid.Resources>
20: <!-- The columns: -->
21: <DataGrid.Columns>
22: <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
23: <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
24: <DataGridHyperlinkColumn Header="WebSite" Binding="{Binding Website}" />
25: <DataGridCheckBoxColumn Header="Billionaire?" Binding="{Binding IsBillionaire}" />
26: <DataGridComboBoxColumn Header="Gender" SelectedItemBinding="{Binding Gender}" ItemsSource="{Binding Source={StaticResource genderEnum}}" />
27: </DataGrid.Columns>
28: <!-- The data: -->
29: <local:Record FirstName="Adam" LastName="Nathan" Website="http://adamnathan.net" Gender="Male" />
30: <local:Record FirstName="Bill" LastName="Gates" Website="http://twitter.com/billgates" IsBillionaire="True" Gender="Male" />
31: </DataGrid>
32: </Grid>
33: </Window>
DataGrid는 열의 재정렬, 크기 조정 및 정렬을 자동으로 지원하지만 CanUserReorderColumns, CanUserResizeColumns, CanUserResizeRows 및 CanUserSortColumns와 같은 속성을 false로 설정하면이 기능 중 일부 또는 전부를 사용하지 않도록 설정할 수 있습니다. 격자 선 및 머리글은 GridLinesVisibility 및 HeadersVisibility 속성을 통해 쉽게 비활성화 할 수 있습니다.
- DataGridTextColumn - 문자열에 가장 적합하며이 열 유형은 일반 표시에 대해 TextBlock을 표시하고 값을 편집 할 때 TextBox를 표시합니다.
- DataGridHyperlinkColumn - 일반 텍스트를 클릭 가능한 하이퍼 링크로 바꿉니다. 그러나 링크를 클릭하는 것과 관련된 기본 동작 (예 : 웹 브라우저 열기)이 없습니다. 이러한 작업을 명시 적으로 처리해야합니다.
- DataGridCheckBoxColumn - 부울 값에 이상적인이 열 유형은 true (선택됨) 또는 false (선택되지 않음) 값을 나타내는 CheckBox를 표시합니다.
- DataGridComboBoxColumn - 열거 형에 가장 적합한이 열 유형은 일반 디스플레이 용 TextBlock을 표시하고 값을 편집 할 때 가능한 값으로 채워진 ComboBox를 표시합니다.
- DataGridTemplateColumn- 값의 일반 표시와 편집 표시에 대해 임의의 템플릿을 설정할 수 있습니다. 이 작업은 CellTemplate 및 CellEditingTemplate 속성을 설정하여 수행됩니다.
Auto-Generated Columns
DataGrid의 항목이 ItemsSource를 통해 설정되면 해당 열을 자동으로 생성하려고 시도합니다. 이 경우 DataGridTextColumn이 문자열에 자동으로 사용되며, DataGridHyperlinkColumn은 URI에 자동으로 사용되며 DataGridCheckBoxColumn은 부울에 자동으로 사용되며 DataGridComboBoxColumn은 열거에 자동으로 사용됩니다.
1: dataGrid.ItemsSource = new Record[] {
2: new Record { FirstName="Adam", LastName="Nathan", Website= new Uri("http://adamnathan.net"), Gender=Gender.Male },
3: new Record { FirstName="Bill", LastName="Gates", Website= new Uri("http://twitter.com/billgates"), Gender=Gender.Male, IsBillionaire=true }
4: };
시각적 인 차이점은 머리글에 사용 된 레이블이며 이제 해당 속성 이름과 일치합니다. DataGrid의 Items 컬렉션에 항목이 직접 배치 된 경우와 달리 각 항목의 필드 편집을 자동으로 지원합니다. 처음 세 열의 셀은 클릭 할 때 자동으로 편집 가능한 텍스트 상자로 바뀌고 CheckBox는 클릭 가능하며 Gender 열의 셀은 클릭 할 때 적절한 값을 가진 ComboBox로 자동 전환됩니다. 키보드 포커스가있는 셀에서도 스페이스 바 또는 F2 키를 누르는 것과 같은 키보드 동작을 사용할 수 있습니다. 모든 편집 내용은 커밋 될 때 기본 ItemsSource 컬렉션에 반영됩니다.
DataGrid에 이미 명시 적 열이 정의되어 있으면 자동 생성 된 열이 뒤에 추가됩니다. 각 열에 대해 한 번 발생하는 AutoGeneratingColumn 이벤트를 처리하여 개별 자동 생성 된 열을 사용자 지정하거나 제거 할 수 있습니다. 모든 열이 생성되면 단일 AutoGeneratedColumns 이벤트가 발생합니다. 자동 생성 된 열을 모두 비활성화하려면 DataGrid의 AutoGenerateColumns 속성을 false로 설정하기 만하면됩니다.
DataGrid는 SelectionMode 및 SelectionUnit이라는 두 가지 속성으로 제어되는 여러 선택 모드를 지원합니다. SelectionMode는 단일 항목 선택의 경우 단일 또는 다중 항목 선택의 경우 확장으로 설정할 수 있습니다. "item"의 정의는 SelectionUnit의 값에 따라 다릅니다. 다음 중 하나로 설정할 수 있습니다:
- Cell - 전용 개별 셀을 선택할 수 있습니다.
- FullRow- 전체 행만 선택할 수 있습니다. 이것이 기본값입니다.
- CellOrRowHeader - 둘 중 하나를 선택할 수 있습니다. 전체 행을 선택하려면 행 헤더를 클릭 합니다.
다중 선택이 활성화 된 경우 Shift 키를 눌러 여러 인접 항목을 선택하거나 Ctrl 키를 눌러 여러 인접하지 않은 항목을 선택할 수 있습니다. 행을 선택하면 Selected 이벤트가 발생하고 SelectedItems 속성에는 항목이 포함됩니다.
개별 셀을 선택하면 SelectedCellChanged 이벤트가 발생하고 SelectedCells 속성에는 관련 열과 데이터에 대한 정보가 들어있는 DataGridCellInfo 구조체 목록이 포함됩니다. 선택 영역과 관련된 DataGridRow 및 DataGridCell의 인스턴스도 자체의 Selected 이벤트를 발생시키고 IsSelected 속성을 true로 설정합니다. 셀이나 행이 여러 개 선택 되더라도 언제든지 포커스가있는 셀은 최대 하나입니다. CurrentCell 속성으로 해당 셀을 가져 오거나 설정할 수 있습니다. 또한 CurrentColumn 속성은 CurrentCell이 포함 된 열을 표시하고 CurrentItem은 CurrentCell 행에 해당하는 데이터 항목을 포함합니다. 대량 선택 및 선택 트랜잭션에 대한 지원은 Selector에서 파생되고 WPF 3.5에 도입 된 기본 MultiSelector 클래스에서 비롯됩니다. 다른 WPF 컨트롤은 여러 선택을 지원하지만 DataGrid는 MultiSelector에서 파생 된 유일한 컨트롤입니다.
Clipboard Interaction
ClipboardCopyMode 속성을 사용하여 DataGrid에서 클립 보드로 복사 한 데이터 (선택 영역에서 Ctrl + C를 누를 때 등)를 사용자 정의 할 수 있습니다:
- ExcludeHeader - Column 헤더는 복사 된 텍스트에 포함되지 않습니다. 이것이 기본값입니다.
- IncludeHeader - Column 헤더는 복사 된 텍스트에 포함됩니다.
- None - 아무것도 클립 보드에 복사 할 수 없습니다.
Virtualization
기본적으로 DataGrid의 행은 가상화됩니다 (UIElements는 화면 밖의 행에 대해 생성되지 않으며 데이터 원본에 따라 느슨하게 가져올 수도 있음). 그러나 열은 그렇지 않습니다. EnableRowVirtualization을 false 또는 EnableColumnVirtualization을 true로 설정하여이 동작을 변경할 수 있습니다. EnableColumnVirtualization은 가로 스크롤을 할 때 프레임 속도를 늦출 수 있기 때문에 기본적으로 true가 아닙니다.
Extra Row Details
DataGrid는 RowDetailsTemplate 속성을 설정하여 행에 대한 확장 된 세부 정보를 표시 할 수 있도록 지원합니다. 일반적으로 RowDetailsTemplate 내부의 요소는 데이터 바인딩을 사용하여 현재 행의 내용을 사용자 정의하지만이 예제에서는 간단한 TextBlock을 사용합니다. 그림은 행을 선택할 때의 결과를 보여줍니다.
1: <Grid>
2: <DataGrid Name="dataGrid" IsReadOnly="False">
3: <DataGrid.RowDetailsTemplate>
4: <DataTemplate>
5: <TextBox Margin="10" FontWeight="Bold">Details go here.</TextBox>
6: </DataTemplate>
7: </DataGrid.RowDetailsTemplate>
8: <!-- Support for showing all genders in the DataGridComboBoxColumn: -->
9: <DataGrid.Resources>
10: <ObjectDataProvider x:Key="genderEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
11: <ObjectDataProvider.MethodParameters>
12: <x:Type Type="local:Gender" />
13: </ObjectDataProvider.MethodParameters>
14: </ObjectDataProvider>
15: </DataGrid.Resources>
16: <!-- The columns: -->
17: <DataGrid.Columns>
18: <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
19: <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
20: <DataGridHyperlinkColumn Header="WebSite" Binding="{Binding Website}" />
21: <DataGridCheckBoxColumn Header="Billionaire?" Binding="{Binding IsBillionaire}" />
22: <DataGridComboBoxColumn Header="Gender" SelectedItemBinding="{Binding Gender}" ItemsSource="{Binding Source={StaticResource genderEnum}}" />
23: </DataGrid.Columns>
24: <!-- The data: -->
25: <local:Record FirstName="Adam" LastName="Nathan" Website="http://adamnathan.net" Gender="Male" />
26: <local:Record FirstName="Bill" LastName="Gates" Website="http://twitter.com/billgates" IsBillionaire="True" Gender="Male" />
27: </DataGrid>
28: </Grid>
기본적으로 세부 정보는 선택한 행에 대해서만 표시되지만이 동작은 RowDetailsVisibilityMode 속성을 사용하여 변경할 수 있습니다. 다음 값 중 하나로 설정할 수 있습니다.
- VisibleWhenSelected - 선택한 행에 대한 행 세부 정보 만 표시됩니다. 이것은 기본값입니다.
- Visible- 모든 행에 대한 행 세부 정보가 표시됩니다.
- Collapsed - 행에 대한 세부 정보가 행에 표시되지 않습니다.
Column Freezing
DataGrid는 임의의 수의 열을 "Freezing"하는 것을 지원합니다. 즉, 절대로 화면 밖으로 스크롤하지 않습니다. 이 지원에는 몇 가지 제한이 있습니다. 가장 왼쪽 열에 만 사용할 수 있으며 고정되지 않은 열에서는 고정 된 열을 다시 정렬 할 수 없습니다 (반대의 경우도 마찬가지 임). 하나 이상의 열을 고정하려면 FrozenColumnCount 속성을 기본값 0 이외의 값으로 설정하기 만하면됩니다.
Editing, Adding, and Removing Data
DataGrid의 ItemsSource를 사용하면 개별 항목의 데이터를 자동으로 편집 할 수 있습니다. ItemsSource 컬렉션이 항목 추가 및 제거를 지원하면 DataGrid는 항목 추가 및 제거도 자동으로 지원합니다. 앞의 예에서 List <Record>에 배열을 래핑하면 (정적 배열은 동적 목록을 초기화하는 데만 사용됩니다)이 기능을 사용하려면 충분합니다.
1: dataGrid.ItemsSource = new List<Record> {
2: new Record { FirstName="Adam", LastName="Nathan", Website= new Uri("http://adamnathan.net"), Gender=Gender.Male },
3: new Record { FirstName="Bill", LastName="Gates", Website= new Uri("http://twitter.com/billgates"), Gender=Gender.Male, IsBillionaire=true }
4: };
이렇게하면 DataGrid의 맨 아래에 빈 행이 추가되어 언제든지 새 항목을 추가 할 수 있습니다. DataGrid는 편집 시작 (F2에 바인딩), 편집 취소 (Esc에 바인딩), 편집 (Enter에 바인딩) 및 행 삭제 (Delete에 바인딩)의 공통 작업에 대한 메서드와 명령을 정의합니다. 편집을 방지하기 위해 IsReadOnly를 true로 설정할 수 있으며 CanUserAddRows / CanUserDeleteRows를 false로 설정하여 추가 및 삭제를 방지 할 수 있습니다.
편집이 자동으로 발생하지만 프로세스 중에 여러 가지 이벤트가 발생하여 사용자 정의 할 수 있습니다: PreparingCellForEdit, BeginningEdit, CellEditEnding/RowEditEnding, and InitializeNewItem.
댓글
댓글 쓰기