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도 요청드립니다…ㅎㅎ
감사합니다!