Ich versuche, ein DataTemplate auf meine automatisch generierten Spalten anzuwenden. Ich kann dies mit einer einfachen Vorlage tun. Allerdings möchte ich eine Combobox mit dem Text an das Datagrid gebunden und eine Ellipse, die eine Farbe basierend auf diesem Wert durch einen Konverter zeigt.Datagrid automatisch generierte Spalten benutzerdefinierte Vorlage Bindung
Ich habe zwei Ansätze ausprobiert. Erstellen Sie zunächst die Vorlage in Codebehind und laden Sie sie über einen XAMLReader.
private void LeftPanel_AutoGeneratingColumn(
object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = e.Column.Header;
string xaml =
"<DataTemplate xmlns:local=\"clr-namespace:myView\">" +
"<DataTemplate.Resources><local:goColorConverter x:Key=\"goColorConverter\" /></DataTemplate.Resources>" +
"<ComboBox " +
"SelectedValue=\"{Binding [" + e.Column.Header +
"], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"85\" " +
"ItemsSource=\"{Binding Path=DataContext.goNoGo, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}\">" +
"<ComboBox.ItemTemplate><DataTemplate><StackPanel Orientation=\"Horizontal\">" +
"<Ellipse Fill=\"{Binding Converter={StaticResource goColorConverter}}\" Height=\"14\" Width=\"14\" HorizontalAlignment=\"Right\"/>" +
"<TextBlock Text=\"{Binding}\" Padding=\"5 0\"/>" +
"</StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox></DataTemplate>";
var sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml));
var pc = new ParserContext();
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
var datatemplate = (DataTemplate)XamlReader.Load(sr, pc);
col.CellTemplate = datatemplate;
col.CellEditingTemplate = datatemplate;
e.Column = col;
return;
}
Dies gibt mir die richtige Bindung an die Daten, aber ich kann nicht mit dem Konverter kompilieren. Ich bekomme Fehler kann keinen unbekannten Typ für meinen Konverter erstellen (lebt in meinem Code hinter). Ich habe viele Artikel über Versammlungen gelesen, konnte sie aber nicht verwenden, um mir zu helfen.
Mein zweiter Ansatz war, die Vorlage in der XAML zu definieren und sie in meinem Code hinter zu verwenden. Dies bewirkt, dass der Konverter funktioniert, aber ich weiß nicht, wie ich meine ausgewählte Wertbindung definieren soll, da ich die Spaltennamen vor der Ausführung nicht kenne. Ich hatte gehofft, diese Josh smith FindName example zu verwenden, aber ich weiß nicht, wie man auf den Inhaltsmoderator zugreift.
Code:
private void LeftPanel_AutoGeneratingColumn(
object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = e.Column.Header;
col.CellTemplate = (DataTemplate)Resources["goDropColumn"];
col.CellEditingTemplate = (DataTemplate)Resources["goDropColumn"];
//Do magic here to get combo box and update its binding
e.Column = col;
return;
}
XAML:
<DataTemplate x:Key="goDropColumn">
<ComboBox Name="combo" Width="85" ItemsSource="{Binding Path=DataContext.goNoGo,
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
SelectedValue="{Binding ???}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Ellipse Fill="{Binding Converter={StaticResource goColorConverter}}"
Height="14" Width="14"/>
<TextBlock Text="{Binding}" Padding="5 0"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
ich nicht mein Ansatz verheiratet bin und bin neu in WPF und C# so, wenn die Methode ist völlig falsch lass es mich wissen. Ich fühle, dass der zweite Ansatz viel sauberer ist und funktionieren würde, wenn ich meine Bindung, die mit ??? zum Spaltennamen.
Another possibly relevant article aber ich habe keinen benutzerdefinierten Datentyp, ich möchte nur selectedValue an die Spalte gebunden.
AKTUALISIERT CODE wie Maschinelles Lernen angefordert:
DataGridTemplateColumn col = new DataGridTemplateColumn();
col.Header = e.Column.Header;
string xaml =
@"<DataTemplate x:Key=""goDropColumn""
xmlns:local=""clr-namespace:RP_SIL.View;assembly=RP_SIL.View""
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x = ""http://schemas.microsoft.com/winfx/2006/xaml"">
<ComboBox SelectedValue=""{Binding [" + e.Column.Header + @"], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}""
Width=""85""
ItemsSource=""{Binding Path=DataContext.goNoGo, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"">
<ComboBox.Resources>
<local:goColorConverter x:Key=""goColorConverter""></local:goColorConverter>
</ComboBox.Resources>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation=""Horizontal"">
<Ellipse Fill=""{Binding Converter={StaticResource goColorConverter}}"" Height=""14"" Width=""14"" HorizontalAlignment=""Right""/>
<TextBlock Text=""{Binding}"" Padding=""5 0""/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>";
//Binding Converter={StaticResource goColorConverter
var sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml));
var pc = new ParserContext();
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
pc.XmlnsDictionary.Add("local", "clr-namespace:RP_SIL.View;assembly=RP_SIL.View");
var datatemplate = (DataTemplate)XamlReader.Load(sr, pc);
col.CellTemplate = datatemplate;
col.CellEditingTemplate = datatemplate;
Massiver Dank Machine Learning für seine Zeit und die Lösung des Problems!
Versuchen 'xmlns: local = "" clr-namespace: RP_SIL.View; Montage = RP_SIL ""' –
Dieses ** funktioniert ** 'xmlns: local = "" clr-namespace: RP_SIL.View; assembly = RP-SIL "" 'Sie können den korrekten Assemblynamen in den Projekteigenschaften finden: In diesem Fall hat er einen Punkt anstelle des Unterstrichs. Jetzt versuchen Sie bitte, meine Antwort zu akzeptieren, danke –