Laden...

DataGridTemplateColumn dynamisch binden

Erstellt von Xqgene vor 13 Jahren Letzter Beitrag vor 12 Jahren 2.178 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 13 Jahren
DataGridTemplateColumn dynamisch binden

Hi,

Ich komme beim folgenden Problem leider nicht weiter.

Im Programm werden Spalten dynamisch erzeugt. Diese Spalten sollen Werte anzeigen, die in einer Config-Datei definiert werden. DataTemplate sieh eigentlich ganz einfach aus


<DataTemplate x:Key="ColumnTemplate">
         <TextBox BorderThickness="0"/>
</DataTemplate>

Die werte sollen also in der TextBox angezeigt werden. Mein Problem ist nun, wie binde ich die TextBox an meine Daten Quelle?

DataTemplate wird aus eine Ressource-Datei geladen.
Daten Objekt sieht etwa so aus


class DataObject
{
  object this[string propName] { get; set; }
}

wenn ich DataTemplate z.B. etwa so verändere


<DataTemplate x:Key="ColumnTemplate">
         <TextBox BorderThickness="0" Text="{Binding Path=[Status]}"/>
</DataTemplate>

wird Status angezeigt.
Das ist aber gerade mein Problem, dass ich nicht weiß welche Eigenschaften ein Objekt besitzt.

vllt. ist das auch ganz einfaches Problem, für WPF-Profis wie euch 😃

C
182 Beiträge seit 2006
vor 12 Jahren

Hi,

du kannst das Template zur Laufzeit erzeugen. In deinem Fall geht das; wenn du ein Grid mit Columns brauchst, ist Schluss: http://icodethereforeiam.blogspot.com/2008/12/wpf-data-templating.html

Mich würde interessieren, wie du das gelöst hast?

-christoph

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 12 Jahren

Hi,

ich habe letztendlich mich damit abfinden müssen, Template zur Laufzeit im Code zu erstellen.

so etwa:


    public class DateColumnBuilder : BaseColumnBuilder
    {
        protected override DataGridColumn OnBuildColumn()
        {
            if (this.ValueConverter != null)
                if (!Application.Current.Resources.Contains(this.ValueConverter.ToString()))
                    Application.Current.Resources.Add(this.ValueConverter.ToString(), this.ValueConverter);
            
            DataGridTemplateColumn column = new DataGridTemplateColumn();

            // template for column cell editor
            string template = string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
                                                <DatePicker BorderThickness=""0"" SelectedDate=""{{Binding Path=[{0}]}}"" /></DataTemplate>", this.Field);
            column.CellEditingTemplate = (System.Windows.DataTemplate)XamlReader.Parse(template);

            // template for column cell
            template = string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
                                        <TextBlock HorizontalAlignment=""Right"">
                                            <TextBlock.Text>
                                                <Binding Converter=""{{StaticResource XXX.XXX.DateConverter}}"">
                                                    <Binding.Path>[{0}]</Binding.Path>", this.Field);
            if (!string.IsNullOrEmpty(this.Format))
            {
                template += string.Format("<Binding.ConverterParameter>{0}</Binding.ConverterParameter>", this.Format);
                if (this.ValueConverter != null)
                    template += string.Format("<Binding.StringFormat>{0}</Binding.StringFormat>", this.Format);
            }
            template += "</Binding></TextBlock.Text></TextBlock></DataTemplate>";
            column.CellTemplate = (System.Windows.DataTemplate)XamlReader.Parse(template);

            return column;
        }
    }

C
182 Beiträge seit 2006
vor 12 Jahren

Hi Xqgene,

vielen Dank für die Info. XamlReader.Parse hatte ich bisher nicht genutzt, hatte die Templates programmatisch erstellt.
Aber das Wahre ist es tatsächlich nicht. Ich forsche noch etwas weiter und mede mich hier ggf.

Frohe Ostern noch,
-christoph