The task is a DataGrid with an unknown number of columns and rows. One column contains textbox, checkbox, imagebutton "Image-ComboBox" and "Text-Combobox" (both non-editable). According to a database query, the grid should be created dynamically. In a DataTemplate, the elements are to be arranged horizontally and those that are not required are to be hidden using "Collapsed". The "Source Binding" works, but unfortunately not the "SelectedValue".
<Window x:Class="Artikelprüfwerte.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Artikelprüfwerte"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:VM/>
</Window.DataContext>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Feldart}" Value="Textbox">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
<Trigger Property="Tag" Value="rt">
<Setter Property="Background" Value="OrangeRed"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Feldart}" Value="Checkbox">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
<Style TargetType="ComboBox">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Feldart}" Value="Combobox">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<DataGrid Name="dgrArtikel" ItemsSource="{Binding ocDessin}" IsReadOnly="True" SelectionMode="Single" HorizontalAlignment="Left" FrozenColumnCount="1" Width="Auto" Margin="20,0,0,0"
ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"
AutoGenerateColumns="False" AlternationCount="2">
</DataGrid>
</Grid>
namespace Artikelprüfwerte
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for (int i = 1; i <= 3; i++)
{
prcAddSpalte(i, (i == 2 ? true : false));
}
}
private void prcAddSpalte(int prmSpalte, bool prmProduktionsende)
{
DataGridTemplateColumn Spalte = new DataGridTemplateColumn();
Spalte.Header = "Spalte-" + prmSpalte;
FrameworkElementFactory tbxFactory = new FrameworkElementFactory(typeof(TextBox));
Binding Bindung = new Binding("Textbox" + prmSpalte);
tbxFactory.SetValue(TextBox.TextProperty, Bindung);
if (prmProduktionsende)
tbxFactory.SetValue(TagProperty, "rt");
FrameworkElementFactory chkFactory = new FrameworkElementFactory(typeof(CheckBox));
FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image));
imgFactory.SetBinding(Image.SourceProperty, new Binding());
imgFactory.SetValue(Image.HeightProperty, (double)40.0);
imgFactory.SetValue(Image.WidthProperty, (double)40.0);
DataTemplate cellTemplate1 = new DataTemplate();
cellTemplate1.DataType = typeof(Image);
cellTemplate1.VisualTree = imgFactory;
FrameworkElementFactory cbxFactory1 = new FrameworkElementFactory(typeof(ComboBox));
cbxFactory1.SetValue(ComboBox.ItemsSourceProperty, new Binding("lstCombobox3"));
cbxFactory1.SetValue(ComboBox.ItemTemplateProperty, cellTemplate1);
//no Binding-Error, but no Data?!
Binding selectedItemBinding = new Binding() { Path = new PropertyPath("SelectedItem1"), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };
cbxFactory1.SetBinding(ComboBox.SelectedValueProperty, selectedItemBinding);
cbxFactory.SetValue(ComboBox.ItemTemplateProperty, (DataTemplate)this.Resources["cbxImagetemplate"]);
FrameworkElementFactory splFactory = new FrameworkElementFactory(typeof(StackPanel));
splFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
if (prmProduktionsende)
splFactory.SetValue(StackPanel.BackgroundProperty, Brushes.Red); //Styletrigger via Tag out of function?!
splFactory.AppendChild(tbxFactory);
splFactory.AppendChild(chkFactory);
splFactory.AppendChild(cbxFactory1);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = splFactory;
Spalte.CellTemplate = cellTemplate;
dgrArtikel.Columns.Add(Spalte);
}
}
}
ViewModel
namespace Artikelprüfwerte
{
class VM : Property
{
private ObservableCollection<DSZeile> _ocDessin = new ObservableCollection<DSZeile>(); public ObservableCollection<DSZeile> ocDessin { get => _ocDessin; set { _ocDessin = value; OnPropertyChanged("ocDessin"); } }
public VM()
{
prcSpalte(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
}
private void prcSpalte(string prmProgrammpfad)
{
ocDessin.Add(
new DSZeile
{
Feldart = "Textbox",
Color = "sw",
Textbox1 = "abc",
Textbox2 = "def",
ocCombobox1 = new ObservableCollection<string>{ @"Bilder\Akustik.png", @"Bilder\Akustik.png" }
});
ocDessin.Add(
new DSZeile
{
Feldart = "Checkbox",
Color = "rt",
Textbox1 = "hij",
Textbox2 = "klm",
ocCombobox1 = new ObservableCollection<string> { @"Bilder\Akustik.png", "5", "6" }
});
ocDessin.Add(
new DSZeile
{
Feldart = "Combobox",
Color = "rt",
Textbox1 = "hij",
Textbox2 = "klm",
lstCombobox3 = new List<string> { prmProgrammpfad + "/Akustik.png", prmProgrammpfad + "/Akustik.png", prmProgrammpfad + "/Fleckschutz.png" }
});
}
}
}
Structure of row:
public class DSZeile : Property
{
public string Feldart { get; set; }
public string Color { get; set; }
public string Textbox1 { get; set; }
public bool Checkbox1 { get; set; }
public ObservableCollection<string> ocCombobox1 { get; set; }
public string Textbox2 { get; set; }
public bool Checkbox2 { get; set; }
public ObservableCollection<string> ocCombobox2 { get; set; }
public string Textbox3 { get; set; }
public bool Checkbox3 { get; set; }
public List<string> lstCombobox3 { get; set; }
public string SelectedItem1 { get; set; }
}