2016-08-03 15 views
0

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!

+0

Versuchen 'xmlns: local = "" clr-namespace: RP_SIL.View; Montage = RP_SIL ""' –

+0

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 –

Antwort

0

Willkommen. Es gibt eine trick, um den Konverter in der XAML zu laden.

Dies ist der Code aus meiner Demo, als ein Beispiel für Sie.

string MyBoolName = "IsEnabled"; 
string MyTextName = "Title"; 
string xaml = 
@"<DataTemplate 
xmlns:local=""clr-namespace:Templating;assembly=Templating"" 
x:Key=""goDropColumn""> 
       <ComboBox Name=""combo"" Width=""85"" ItemsSource=""{Binding Path=DataContext.MyThings, 
     RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"" 

     > <!-- SelectedValue=""{Binding ???}"" --> 
<ComboBox.Resources> 
<local:BrushColorConverter x:Key=""goColorConverter""></local:BrushColorConverter> 
</ComboBox.Resources> 


        <ComboBox.ItemTemplate> 
         <DataTemplate> 
          <StackPanel Orientation=""Horizontal""> 
           <Ellipse Fill=""{Binding ""{Binding "+ MyBoolName + @"}"", Converter={StaticResource goColorConverter}}"" 
          Height=""14"" Width=""14"" /> 
           <TextBlock Text=""{Binding " + MyTextName + @"}"" Padding=""5 0""/> 
          </StackPanel> 
         </DataTemplate> 
        </ComboBox.ItemTemplate> 
       </ComboBox> 
      </DataTemplate>"; 
+0

Ist das, wonach Sie gefragt haben? Könnten Sie mir ein Feedback geben oder meine Antwort akzeptieren, wenn es wie erwartet funktioniert? –

+0

Vielen Dank für Ihre Zeit, Sie haben mein Problem richtig erkannt. Aber keine Freude, es stößt auf denselben Fehler wie zuvor. Kann keinen unbekannten Typ '{clr-namespace: MyNameSpace; assembly = MyNameSpace} BrushColorConverter' erstellen. Der Konverter und der Namespace sind die gleichen wie mein Code-Behind, muss ich etwas tun, um es zu einer separaten Assembly oder etwas zu machen. das '; assembly = Templating' bedeutet mir nichts. Habe ich einen Schritt verpasst? Oder muss ich etwas anderes verwenden, um mein xml zu laden (siehe erstes Code-Snippet) .Ich habe mehr Informationen hinzugefügt, also gelöschten vorherigen Kommentar als nicht editierbar –

+0

Mein letzter Kommentar ist, dass es einige Fehler in den Namen geben muss, die Sie für den Namespace oder geschrieben haben Die Montage und es ist unmöglich, sie zu erkennen, ohne das ganze Projekt zu sehen (wo Sie sie definiert haben). –

Verwandte Themen