【问题标题】:Binding Column properties of Xceed DataGrid to viewmodel property attribute将 Xceed DataGrid 的 Column 属性绑定到 viewmodel 属性属性
【发布时间】:2014-01-10 15:46:19
【问题描述】:

我正在使用AutoCreatedColumns 绑定到 Xceed DataGridControl(社区版)

ObservableCollection<ItemViewModel> Items

我想根据 viewmodel 属性上的 Editable 属性标记已创建列的 ReadOnly 属性。

 class ItemViewModel : ViewModelBase {

     [Editable(false)] 
     public string Id { get; set; }

     string _comment;
     [Editable(true)]
     public string Comment {
         get { return _comment; }
         set {
              _comment = value;
              NotifyOfPropertyChanged(() => Comment);
         }
     // Other properties ...

 }

这可能吗?还是有另一种方法可以挂钩到列的创建以检查正在绑定并以编程方式设置为 ReadOnly 的属性?

【问题讨论】:

    标签: wpf data-binding mvvm xceed-datagrid


    【解决方案1】:

    我认为最佳解决方案是像这样连接到ItemsSourceChangeCompleted 事件:

    void _dataGrid_ItemsSourceChangeCompleted(object sender, EventArgs e)
    {
        DataGridControl control = (DataGridControl)sender;
        Type itemType = control.ItemsSource.GetType().GenericTypeArguments[0];
        foreach (var col in control.Columns)
        {
            PropertyInfo propInfo = itemType.GetProperty(col.FieldName);
            if (propInfo != null)
            {
                EditableAttribute editableAttribute = propInfo.GetCustomAttributes().OfType<EditableAttribute>().FirstOrDefault();
                col.ReadOnly = (editableAttribute == null || !editableAttribute.Value);
            }
            else
            {
                col.ReadOnly = false;
            }
        }
    }
    

    或者,您可以将单元格ReadOnly 属性绑定到您的可编辑属性,如here 所述。

    如果您知道要显示哪些列,则可以简化上面的解决方案并像这样绑定列ReadOnly 属性:

    public class EditableConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                PropertyInfo propInfo = value.GetType().GenericTypeArguments[0].GetProperty(parameter.ToString());
                if (propInfo != null)
                {
                    EditableAttribute editableAttribute = propInfo.GetCustomAttributes().OfType<EditableAttribute>().FirstOrDefault();
                    return (editableAttribute == null || !editableAttribute.Value);
                }
            }
            return false;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
    <xcdg:DataGridControl.Columns>
        <xcdg:Column FieldName="Id" 
                     ReadOnly="{Binding RelativeSource={RelativeSource Self}, 
                        Path=DataGridControl.ItemsSource, 
                        Converter={StaticResource EditableConverter}, ConverterParameter=Id}" />
        <xcdg:Column FieldName="Comment" 
                     ReadOnly="{Binding RelativeSource={RelativeSource Self}, 
                        Path=DataGridControl.ItemsSource, 
                        Converter={StaticResource EditableConverter}, ConverterParameter=Comment}" />
    </xcdg:DataGridControl.Columns>
    

    但是,您不妨关闭AutoCreateColumns 并在代码中自己定义Columns 集合(或关闭AutoCreateItemProperties 并创建您自己的DataGridCollectionViewSource,并在其中适当地设置每个DataGridItemProperty.IsReadOnly)。

    【讨论】:

    • 谢谢!在这种情况下,我最终对 XAML 中的列进行了硬编码,但这是未来的好信息!
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2017-08-08
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多