-
[DX_WPF] PropertyGridControlDevExpress/DX_WPF 2023. 6. 20. 17:36
DevExpress Demo
PropertyGrid 참조
PropertyView.xaml
<UserControl x:Class="PMProperties.Views.PropertiesView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm" xmlns:prism="http://prismlibrary.com/" xmlns:viewModel="PMProperties.ViewModels" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars" xmlns:dxprg="http://schemas.devexpress.com/winfx/2008/xaml/propertygrid" xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking" prism:ViewModelLocator.AutoWireViewModel="True"> <!--#region Resources--> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PMProperties;component/Resources/ResourceDictionary.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <!--#endregion--> <!-- SelectedObject="{Binding Path=SelectedItem.Data}" --> <DockPanel> <dxprg:PropertyGridControl x:Name="pPropertyGrid" ShowProperties="All" SelectedObject="{Binding AppDatadddddddd}" PropertyDefinitionsSource="{Binding Properties}" PropertyDefinitionTemplateSelector="{StaticResource DynamicallyAssignDataEditorsTemplateSelector}" PropertyDefinitionStyle="{StaticResource DynamicallyAssignDataEditorsPropertyDefinitionStyle}" ExpandCategoriesWhenSelectedObjectChanged="True" ShowDescriptionIn="ToolTipAndPanel" dxe:ValidationService.AllowAccessibilityAlerts="True"> <dxmvvm:Interaction.Behaviors> <dxmvvm:EventToCommand EventName="SelectionChanged" Command="{Binding ItemSelectionChangedCommand}" CommandParameter="{Binding ElementName=RoutedEventArgs}" PassEventArgsToCommand="True"/> </dxmvvm:Interaction.Behaviors> </dxprg:PropertyGridControl> </DockPanel> </UserControl>
ResorceDictionary.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PMProperties.Data" xmlns:dxprg="http://schemas.devexpress.com/winfx/2008/xaml/propertygrid" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:controls="clr-namespace:PMProperties.Controls" > <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PMProperties;component/Resources/DescriptionResource.xaml" /> </ResourceDictionary.MergedDictionaries> <local:DynamicallyAssignDataEditorsTemplateSelector x:Key="DynamicallyAssignDataEditorsTemplateSelector"/> <DataTemplate x:Key="descriptionTemplate"> <RichTextBox x:Name="descriptionRichTextBox" Foreground="{Binding Path=(TextElement.Foreground), RelativeSource={RelativeSource TemplatedParent}}" Background="Transparent" BorderThickness="0" IsReadOnly="True" MinWidth="150" HorizontalContentAlignment="Stretch" controls:DescriptionAttachedBehavior.Description="{Binding}" IsTabStop="False" /> </DataTemplate> <Style TargetType="dxprg:PropertyDefinition" x:Key="DynamicallyAssignDataEditorsPropertyDefinitionStyle"> <Setter Property="Path" Value="{Binding Name}"/> <Setter Property="Description" Value="{Binding}"/> <Setter Property="DescriptionTemplate" Value="{StaticResource descriptionTemplate}"/> </Style> <DataTemplate x:Key="Name"> <dxprg:PropertyDefinition > <dxprg:PropertyDefinition.EditSettings> <dxe:TextEditSettings MaskType="RegEx"/> </dxprg:PropertyDefinition.EditSettings> </dxprg:PropertyDefinition> </DataTemplate> <DataTemplate x:Key="Description"> <dxprg:PropertyDefinition> <!--<dxprg:PropertyDefinition.CellTemplate> <DataTemplate> <dxe:TextEdit/> </DataTemplate> </dxprg:PropertyDefinition.CellTemplate>--> <dxprg:PropertyDefinition.EditSettings> <dxe:TextEditSettings/> </dxprg:PropertyDefinition.EditSettings> </dxprg:PropertyDefinition> </DataTemplate> <DataTemplate x:Key="HyperlinkEdit"> <dxprg:PropertyDefinition> <dxprg:PropertyDefinition.EditSettings> <dxe:HyperlinkEditSettings AllowAutoNavigate="True"/> </dxprg:PropertyDefinition.EditSettings> </dxprg:PropertyDefinition> </DataTemplate> </ResourceDictionary>
DynamicallyAssignDataEditorsTemplateSelector.cs
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Diagnostics; namespace PMProperties.Data; //internal class DataTemplateSelector //{ //} public class DynamicallyAssignDataEditorsTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement element = (FrameworkElement)container; //var tName = GetTemplateName((PropertyDescriptor)item); DataTemplate resource = element.TryFindResource(GetTemplateName((PropertyDescriptor)item)) as DataTemplate; //var retBase = base.SelectTemplate(item, container); return resource ?? base.SelectTemplate(item, container); } public static string GetTemplateName(PropertyDescriptor property) { var displayAttribute = (DisplayAttribute)property.Attributes[typeof(DisplayAttribute)]; //var ret = displayAttribute.GetDescription() ?? displayAttribute.GetName(); return displayAttribute.GetName(); } }
DescriptionAttachedBehavior.cs
using PMProperties.Data; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Media; using System.Windows; using System.Windows.Documents; using System.Windows.Markup; namespace PMProperties.Controls; [ContentProperty("Paragraph")] public class ParagraphContainer : Control { public Paragraph Paragraph { get; set; } } public class DescriptionAttachedBehavior : DependencyObject { static readonly DependencyProperty DescriptionProperty; static DescriptionAttachedBehavior() { DescriptionProperty = DependencyProperty.RegisterAttached("Description", typeof(object), typeof(DescriptionAttachedBehavior), new FrameworkPropertyMetadata(null, DescriptionChanged)); } public static void SetDescription(DependencyObject d, object value) { d.SetValue(DescriptionProperty, value); } public static object GetDescription(DependencyObject d) { return d.GetValue(DescriptionProperty); } static void DescriptionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var rtb = d as RichTextBox; if (rtb == null || rtb.Document == null) return; rtb.Document.Blocks.Clear(); var property = e.NewValue as PropertyDescriptor; if (property == null) return; var resName = rtb.TryFindResource(DynamicallyAssignDataEditorsTemplateSelector.GetTemplateName(property) + "Description") as ControlTemplate; if (resName == null) return; ContentControl control = new ContentControl() { Template = rtb.TryFindResource(DynamicallyAssignDataEditorsTemplateSelector.GetTemplateName(property) + "Description") as ControlTemplate}; control.ApplyTemplate(); ParagraphContainer container = VisualTreeHelper.GetChild(control, 0) as ParagraphContainer; rtb.Document.Blocks.Add(container.Paragraph); } }
DescriptionResource.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:PMProperties.Controls"> <ControlTemplate x:Key="HyperlinkEditDescription"> <controls:ParagraphContainer> <Paragraph> <Span FontWeight="Bold">HyperlinkEdit</Span> - An editor that presents its contents as a hyperlink. </Paragraph> </controls:ParagraphContainer> </ControlTemplate> </ResourceDictionary>
728x90'DevExpress > DX_WPF' 카테고리의 다른 글
[DX_WPF] xpf ~ Reference (1) 2023.11.28 [DX_WPF] Dynamic Load Modules In DevExpress MVVM For WPF (0) 2023.11.23 [DX_WPF] ToolTip, SuperTip (0) 2023.06.07 [DX_WPF] dxmvvm:Interaction.Behaviors (0) 2023.05.19 [DX_WPF] dxmvvm:Interaction.Behaviors vs dxmvvm:Interaction.Triggers (0) 2023.05.16 댓글