Xcreed DataGridからViewModelプロパティ属性へのバインド列プロパティ
-
21-12-2019 - |
質問
AutoCreatedColumns
ObservableCollection<ItemViewModel> Items
.
ViewModelプロパティのReadOnly
属性に基づいて、作成された列 'Editable
プロパティをマークします。
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 ...
}
.
これは可能ですか?または、拘束されているプロパティを検査するための列の作成にフックすることができるもう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;
}
}
}
.
あるいは、説明されているように、Cell ReadOnly
プロパティを編集可能な属性にバインドすることもできます。a>。
表示したい列がわかっている場合は、上記のソリューションを簡素化し、列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
を適切に設定した状態で)。
所属していません StackOverflow