ControlTemplate์ด ์ ์ฉ๋๋ ์๋ฆฌ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
DevExpress์ ๋ฌธ์ํด์ ๋ฐ์ ์ํ์ธ๋ฐโฆ์ด ์ํ๊ณผ ๋๊ฐ์ด ์ํํด๋ ์ ์์ค์์๋ ์ ํ ์ ํ
๋๋ฆฌ๊ฐ ์ ์ฉ๋์ง ์๋ค์.
<Window
x:Class="DXSample.NetCore.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:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"
xmlns:local="clr-namespace:DXSample.NetCore"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="450"
UseLayoutRounding="True"
mc:Ignorable="d">
<Window.Resources>
<ControlTemplate x:Key="{dxgt:GridCardThemeKey ResourceKey=ContainerTemplate, ThemeName=Office2019Colorful}" TargetType="{x:Type ContentControl}">
<Grid x:Name="Root" Background="Transparent">
<Border
x:Name="IsDefault"
Background="#FFF8F8F8"
BorderBrush="#FFABABAB"
BorderThickness="1">
<ContentPresenter />
</Border>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="dxg:GridViewBase.IsFocusedRow" Value="False" />
</MultiTrigger.Conditions>
</MultiTrigger>
<DataTrigger Binding="{Binding Path=(dxg:RowData.RowData).SelectionState, RelativeSource={RelativeSource TemplatedParent}}" Value="Focused">
<Setter TargetName="IsDefault" Property="BorderBrush" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=(dxg:RowData.RowData).SelectionState, RelativeSource={RelativeSource TemplatedParent}}" Value="Selected">
<Setter TargetName="IsDefault" Property="BorderBrush" Value="Red" />
</DataTrigger>
<Trigger Property="dxg:GridViewBase.IsFocusedRow" Value="True" />
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<DockPanel>
<Button Command="{Binding SelectCommand}" DockPanel.Dock="Bottom">
Select
</Button>
<dxg:GridControl
AutoGenerateColumns="AddNew"
ItemsSource="{Binding Items}"
SelectedItems="{Binding SelectedItems}"
SelectionMode="Row">
<dxg:GridControl.View>
<dxg:CardView />
</dxg:GridControl.View>
</dxg:GridControl>
</DockPanel>
</Window>
using System.Windows;
using System.Collections.ObjectModel;
using DevExpress.Mvvm;
using DevExpress.Mvvm.DataAnnotations;
namespace DXSample.NetCore {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
}
public class MainViewModel : ViewModelBase {
public ObservableCollection<Item> Items { get => GetValue<ObservableCollection<Item>>(); set => SetValue(value); }
public ObservableCollection<Item> SelectedItems { get => GetValue<ObservableCollection<Item>>(); set => SetValue(value); }
public MainViewModel() {
Items = new ObservableCollection<Item>();
for (int i = 0; i < 100; i++) {
var item = new Item { Id = i, Name = string.Format("Name_{0}", i) };
Items.Add(item);
}
SelectedItems = new ObservableCollection<Item>();
}
[Command]
public void Select() {
SelectedItems.Clear();
for (int i = 0; i < 10; i++)
SelectedItems.Add(Items[i]);
}
}
public class Item {
public int Id { get; set; }
public string Name { get; set; }
}
}
์์ค์ฒจ๋ถ๊ฐ ๋์ง ์์ ๋ณต๋ถ์ผ๋ก ๋จ๊น๋๋ค. ์์ ์์ค๊ฐ ์ํ์ ์ ๋ถ์ด๋ฏ๋ก, MainWindow.xamlํ๊ณ ์ฝ๋๋นํ์ธ๋์ ๋ถ์ฌ๋ฃ์ผ์๋ฉด ๋ฉ๋๋ค.
์คํํ์๊ณ Visual Tree ์ผ๋ณด์๋ฉด CardView์ Item์ผ๋ก ControlTemplate์ผ๋ก ์ ์ํ ์์๋ค์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฒ์ DevExpress์ ๊ธฐ์ ์ผ๊น์? WPF์์ ๋ชจ๋ ์ปจํธ๋กค์ ContentControl, ItemsControl ๋ ์คํ๋๋ฅผ ์์๋ฐ์ ๊ตฌํ๋ ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ TargetType์ผ๋ก ContentControl์ ์ง์ ํ๋๋ฐ CardView์ Item์๋ง ์๊ธฐ๋ ๊ฒ์ผ๊น์?
๊ทธ๋ฆฌ๊ณ ํน์โฆ์ PC์ ์ด๊ฑธ ์ ์ ์ฉํด๋ ์๋๋์ง ํน์ ๋ด์ฃผ์ค ๋ถ์ด ๊ณ์๋ค๋ฉด LiveShare๋ ์์ฒญ๋๋ฆฝ๋๋ค..ใ ใ
๊ฐ์ฌํฉ๋๋ค!