У меня есть проект, который может динамически настраивать код XAML для создания динамических форм c. Итак, что мне нужно сделать, так это сгенерировать динамическую c сетку (динамическую c строки и столбцы) внутри такой настраиваемой формы динамической c. Я следовал приведенной ниже процедуре и столкнулся с указанной ниже проблемой. Кто-нибудь может, пожалуйста Помогите? Я получаю dynobjects через список, где dynobjects уже были перечислены в базе данных.
My View.xaml.cs is as follows.
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
if (!loaded)
{
DynDataFormViewModel viewModel = ((DynDataFormViewModel)this.DataContext);
MyExpando expando = null;
DynForm dynForm = GetDynamicFormByID(viewModel.Entity.DynFormId);
foreach (var item in dynForm.DynObjects)
{
if (item.DataType == DataType.Grid)
{
List<DynObject> dynObjectList = dynForm.DynObjects.Where(x => x.DynFormId == dynForm.Id).ToList();
List<DynObject> dynObjectList1 = new List<DynObject>(dynObjectList.Where(a => a.DataType != DataType.Grid)).ToList();
IDictionary<string, object> dict;
//var lookup = DataModel.Source.ToLookup(t => t.Item);
foreach (var ob in dynObjectList1)
{
dynamic row = new ExpandoObject();
//row.Id = int.Parse(ob.Name.Replace("Item", ""));
//row.Name = ob.Key;
row.Id = 1;
dict = row;
item.Rows.Add(row);
}
dict = item.Rows[0];
item.Columns = new List<Column>
{
};
foreach (var subitem in dynObjectList.ToList())
{
string maskVal = null;
if (subitem.DataType == DataType.Text)
{
maskVal = "A";
item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.String, maskVal));
}
else if (subitem.DataType == DataType.Boolean)
{
item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Bool, maskVal));
}
else if (subitem.DataType == DataType.Date)
{
maskVal = "d";
item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Date, maskVal));
}
else if (subitem.DataType == DataType.Double)
{
maskVal = "f";
item.Columns.Add(new Column(subitem.Name, subitem.Name, FieldTypes.Decimal, maskVal));
}
}
for (var i = 0; i < item.Columns.Count; i++)
{
if (dict.ContainsKey(item.Columns[i].FieldName)) continue;
dict.Add(item.Columns[i].FieldName, string.Empty);
}
}
}
I have a converter.cs calss as below.
public class FieldTypeToEditSettingsConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
var column = (Column)value;
object editor;
switch (column.FieldType)
{
case FieldTypes.String:
editor = new TextEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
break;
case FieldTypes.Int:
case FieldTypes.Decimal:
editor = new SpinEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
break;
case FieldTypes.Date:
editor = new DateEditSettings { Mask = column.Mask, MaskUseAsDisplayFormat = true };
break;
case FieldTypes.Bool:
editor = new CheckEditSettings { IsThreeState = false, NullValue = false };
break;
default:
throw new ArgumentOutOfRangeException();
}
return editor;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
** My configuarable xaml code is as follows.**
<UserControl x:Class="System.Windows.Controls.UserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:views="clr-namespace:ProjectName.WpfUI.Views;assembly=ProjectName.WpfUI"
xmlns:Common="clr-namespace:ProjectName.WpfUI.Converters;assembly=ProjectName.WpfUI"
xmlns:dxci="http://schemas.devexpress.com/winfx/2008/xaml/core/internal"
mc:Ignorable="d" d:DesignHeight="500" d:DesignWidth="500">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="…/…/Resources/MyConverters.xaml"/>
<ResourceDictionary Source="…/…/Resources/MyContextStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Common:FieldTypeToEditSettingsConverter x:Key="FieldTypeToEditSettingsConverter" />
<Style TargetType="{x:Type dxg:GridControl}">
<Setter Property="AutoGenerateColumns" Value="None"/>
<Setter Property="EnableSmartColumnsGeneration" Value="True"/>
<Setter Property="ColumnGeneratorTemplate">
<Setter.Value>
<DataTemplate>
<ContentControl>
<dxg:GridColumn FieldName="{Binding (dxci:DependencyObjectExtensions.DataContext).FieldName, RelativeSource={RelativeSource Self}}"
Header="{Binding (dxci:DependencyObjectExtensions.DataContext).Header, RelativeSource={RelativeSource Self}}"
EditSettings="{Binding ., Converter={StaticResource FieldTypeToEditSettingsConverter}}"/>
</ContentControl>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ColumnGeneratorStyle">
<Setter.Value>
<Style TargetType="{x:Type dxg:GridColumn}">
<Setter Property="FilterPopupMode" Value="CheckedList"/>
</Style>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type dxg:TableView}">
<Setter Property="ShowGroupPanel" Value="False"/>
<Setter Property="ShowTotalSummary" Value="False"/>
<Setter Property="NavigationStyle" Value="Row"/>
<Setter Property="AutoWidth" Value="True"/>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<DockPanel LastChildFill="True" >
<dxr:RibbonControl DockPanel.Dock="Top" RibbonStyle="Office2007" ToolbarShowMode="Hide">
dxr:RibbonControl.ToolbarItems
<dxb:BarButtonItem Content="BarButtonItem"/>
</dxr:RibbonControl.ToolbarItems>
<dxr:RibbonDefaultPageCategory Caption="Default Category">
</dxr:RibbonDefaultPageCategory>
</dxr:RibbonControl>
<dxr:RibbonStatusBarControl DockPanel.Dock="Bottom" >
dxr:RibbonStatusBarControl.LeftItems
<dxb:BarStaticItem Content="{Binding NumberOfValidationErrors, StringFormat=Number of Validation Errors: {0}}"/>
dxb:BarItemSeparator/
<dxb:BarStaticItem Content="{Binding IsValid, StringFormat=Form Validity: {0}}"/>
dxb:BarItemSeparator/
<dxb:BarStaticItem Content="{Binding ErrorFieldList, StringFormat=Error Fields{0}}"/>
</dxr:RibbonStatusBarControl.LeftItems>
</dxr:RibbonStatusBarControl>
<dxlc:LayoutGroup Orientation="Vertical" View="Group" Padding="5">
<dxlc:LayoutGroup Header="Group1" View="GroupBox" ItemLabelsAlignment="Local" Orientation="Vertical">
dxlc:LayoutGroup
<Grid>
<dxg:GridControl Name="TestGrid1" MaxHeight="500" DataContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dxlc:LayoutGroup}}" ColumnsSource="{Binding TestGrid1.Columns}" ItemsSource="{Binding TestGrid1.Rows}" >
dxg:GridControl.Columns
</dxg:GridControl.Columns>
dxg:GridControl.View
<dxg:TableView Name="tableView1"
AutoWidth="True"
NavigationStyle="Cell"
NewItemRowPosition="Top"
AllowEditing="True"
ShowDataNavigator="True" > </dxg:TableView>
</dxg:GridControl.View>
</dxg:GridControl>
</Grid>
</dxlc:LayoutGroup>
The outcome is as follows(attached png)
Clipboard-File-1.png
[enter image description here][enter image description here][1][2]
Примечание: этот XAML - это настраиваемый код через интерфейс времени выполнения. Это не XAML-код представления. Я собирался создать набор строк и столбцов в соответствии со списком динамических c объектов, которые я раньше хранил в таблице базы данных.
Кто-нибудь может предложить способ сохранения этих данных сетки в файл XML, который можно сохранить в поле базы данных varchar (max) ?? Я не смог добиться успеха с некоторыми ссылками. Мне также нужно снова получить данные / загрузить сохраненные данные в сетку.
Я использовал приведенный ниже код, но кнопка сохранения не активируется при обновлении значения ячейки
private ObservableCollection<ExpandoObject> _rows { get; set; }
[NotMapped]
public ObservableCollection<ExpandoObject> Rows {
get { return _rows; }
set { _rows = value;NotifyPropertyChanged("Rows"); }
}
[1]: https://i.stack.imgur.com/TP1FQ.png
[2]: https://i.stack.imgur.com/czNSr.png