【问题标题】:MVVM: customize devexpress propertyGridControlMVVM:自定义 devexpress propertyGridControl
【发布时间】:2016-03-17 20:27:28
【问题描述】:

我的 XAML 中有一个 PropertyGridControl。它从 GridControl 的选定行中显示对象的属性。当我单击一行时,它会填充 PropertyGridControl。我正在使用 MVVM 模式。

propertyGridControl 的 XAML 是:

<dxprg:PropertyGridControl  SelectedObject="{Binding SelectedItem,ElementName=lst1}" ShowProperties="All" ShowCategories="False" Margin="473,0,0,133"/>

但是如何自定义 PropertyGridControl? 示例:

从此:

对此:

对我来说,重点是在单选按钮元素中自定义数据库的 boolean/tinyint 字段以及在组合框中自定义外部键。

对于德米特里格:

按照您的提示,现在我有了我的 xaml 文件,其中包含:

<dxlc:DataLayoutControl Grid.Column="1" CurrentItem="{Binding GroupedLayoutData}" HorizontalAlignment="Left" Height="204" Margin="10,132,0,0" VerticalAlignment="Top" Width="278"/>

还有我的 viewModel.cs 文件,我在其中按照示例创建了一个 UI。但是我什么都看不到,哪里错了?

   public class GroupedLayoutData {
        const string JobGroup = "Job";
        const string ContactGroup = "Contact";
        const string AddressGroup = "Address";
        const string PersonalGroup = "Personal";

        [Display(GroupName = AddressGroup, ShortName = "", Order = 4)]
        public string AddressLine1 { get; set; }
        [Display(GroupName = AddressGroup, ShortName = "")]
        public string AddressLine2 { get; set; }
        [Display(GroupName = PersonalGroup, Name = "Birth date")]
        public DateTime BirthDate { get; set; }
        [Display(GroupName = ContactGroup)]
        public string Email { get; set; }
        [Display(Name = "First name", Order = 0)]
        public string FirstName { get; set; }
        [Display(GroupName = PersonalGroup, Order = 5)]
        //public Gender Gender { get; set; }
        //[Display(GroupName = JobGroup, Order = 2)]
        public string Group { get; set; }
        [Display(GroupName = JobGroup, Name = "Hire date")]
        public DateTime HireDate { get; set; }
        [Display(Name = "Last name", Order = 1)]
        public string LastName { get; set; }
        [Display(GroupName = ContactGroup, Order = 3), DataType(DataType.PhoneNumber)]
        public string Phone { get; set; }
        [Display(GroupName = JobGroup), DataType(DataType.Currency)]
        public decimal Salary { get; set; }
        [Display(GroupName = JobGroup, Order = 21)]
        public string Title { get; set; }
    }

编辑 ii:如何将定义布局的类绑定到我的 datalayoutcontrol?

【问题讨论】:

  • 你知道所有的属性吗?
  • 在我看来就像 TemplateSelector 的工作。 Here 是一个帮助您入门的链接。它帮助我理解了如何处理类似的问题。
  • @bit:是的,我知道所有的属性。数据是我数据库中的记录。
  • @XAMIMAX:现在我正在寻找......我希望这是另一个简单但有用的提示! :)
  • @XAMlMAX 我读过它......但是......它也适用于 devexpress 对象吗?我试过了,但我认为不是..还是我错了?你有没有将它用于 devexpress 对象?你有例子吗?

标签: c# wpf xaml mvvm devexpress


【解决方案1】:

当使用 DevExpress 完成您描述的任务时,我建议您尝试使用DataLayoutControl。当您通过DataLayoutControl.CurrentItem 属性将 DataLayoutControl 绑定到任何数据对象时,此控件将自动构建一个布局以编辑对象的公共属性。

下面是 DataLayoutControl 和 Grid 的最小示例:

模型(C#代码):

public class Person {
    const string PersonalGroup = "Personal";
    [Display(Name = "First Name", GroupName = PersonalGroup)]
    public string FirstName { get; set; }
    [Display(Name = "Last Name", GroupName = PersonalGroup)]
    public string LastName { get; set; }
    [Display(Name = "Birth date", GroupName = PersonalGroup)]
    public DateTime BirthDate { get; set; }
    [Display(GroupName = PersonalGroup)]
    public int Age { get; set; }

    [Display(GroupName = "Contact"), DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }
}

ViewModel(C# 代码)

public class ViewModel {
    public ViewModel() {
        Persons = new ObservableCollection<Person> { 
            new Person(){ FirstName = "Peter", LastName ="Parker", Age=33 },
            new Person(){ FirstName = "Mary", LastName ="Jane" , Age=31 }
        };
    }
    public ObservableCollection<Person> Persons { get; private set; }
    public Person SelectedPerson { get; set; }
}

查看(XAML 标记):

<Window.DataContext>
    <local:ViewModel />
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <dxg:GridControl Grid.Column="0" 
            AutoGenerateColumns="AddNew"
            ItemsSource="{Binding Persons}" 
            SelectedItem="{Binding SelectedPerson}"
        >
        <dxg:GridControl.View>
            <dxg:TableView ShowGroupPanel="False" BestFitArea="All" AllowEditing="False"/>
        </dxg:GridControl.View>
    </dxg:GridControl>
    <dxlc:DataLayoutControl Grid.Column="1"
            CurrentItem="{Binding SelectedPerson}"
       />
</Grid>

结果(截图):

您可以在this demo 中查看此方法的实际应用(链接指向 Silverlight 版本,但 WPF 版本的行为完全相同)。您可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性,也可以使用 Fluent-API 来管理属性编辑器的生成过程。

更新:
您可以使用DataLayoutControl.AutoGeneratingItem 事件来更改任何属性的编辑器。此方法已在以下 DevExpress 支持线程中讨论:
- How to Customize controls inside WPF DataLayoutControl
- WPF DataLayoutControl questions
- DataLayoutControl

附:以后,建议您使用DevExpress Support Center 获得官方和有保障的 DevExpress 产品使用帮助。

【讨论】:

  • 以及如何在 mvvm 设计模式中从我的视图模型中绑定/渲染 DataLayoutControl 类?
  • 对我来说有点奇怪的问题......只需将 DataLayoutControl 添加到 View 中,然后将 DataLayoutControl.CurrentItem 属性绑定到 ViewModel 的 SelectedItem 属性。
  • 可能是个愚蠢的问题? =) 抱歉,我的 mvvm 体验刚刚开始! :) 谢谢你! :)
  • 我已经编辑了这个问题,我正在尝试按照你说的那样做,但它仍然不起作用
  • 再次更新了我的答案。
【解决方案2】:

试试FocusedRowChanged事件的gridview。

propertyGridControl1.SelectedObject = gridView1.GetFocusedRow();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多