2016-08-03 19 views
0

私は自動生成された列にDataTemplateを適用しようとしています。私は単純なテンプレートでこれを行うことができます。しかし、私は、コンバータを介してこの値に基づいて色を示すデータグリッドと楕円にバインドされたテキストでコンボボックスが欲しいです。Datagrid自動生成列カスタムテンプレートバインディング

私は2つのアプローチを試みました。まず、コードビハインドでテンプレートを作成し、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; 
    } 

これは私にデータへの正しいバインディングを与えますが、私はコンバータでコンパイルできません。私はエラーが私のコンバータ(私のコードの中に住んでいる)のための未知のタイプを作成することはできません。私はアセンブリに関する多くの記事を読んだことがありますが、それらを使って私を助けませんでした。

私の2番目のアプローチは、テンプレートをxamlで定義し、それを自分のコードの中に適用することでした。これはコンバータを動作させますが、実行前に列名がわからないため、選択した値のバインディングを定義する方法がわかりません。このJosh smith FindName exampleを使用したいと考えていましたが、コンテンツプレゼンターにアクセスする方法がわかりません。

コード:

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> 

方法は完全に間違っているなら、私に知らせてくださいので、私は私のアプローチに結婚し、WPFとC#に新しいですないです。私は二番目のアプローチがもっときれいで、私がバインディングを変更できるかどうかを気にしていると思います???列名に追加します。

Another possibly relevant article私はカスタムデータ型を持っていません、私はちょうど列にboundValueをバインドします。機械学習によって要求されるように

更新されたコード:自分の時間と問題を解決するための機械学習へ

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; 

大規模なありがとう!

+0

'のxmlns試してみてください:ローカル= "" CLR名前空間:RP_SIL.View;アセンブリ= RP_SIL ":ローカル= "" CLR名前空間:** 'のxmlns動作します。この' –

+0

" RP_SIL.Viewを。 assembly = RP-SIL ""とすると、プロジェクトプロパティで正しいアセンブリ名を見つけることができます。この場合は、アンダースコアの代わりにドットが表示されます。今すぐ試してみてください、私の答えを受け入れる、ありがとう –

答えて

0

ようこそ。 xamlにコンバータをロードするためのtrickがあります。

これは私のデモのコードです。あなたの例です。

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

これはあなたが求めていたものですか?期待どおりに働いていれば、フィードバックを提供したり、自分の答えを受け入れることができますか? –

+0

問題を正しく認識してくれてありがとうございます。しかし、喜びは、これは私が以前持っていたのと同じエラーに遭遇する。未知の型 '{clr-namespace:MyNameSpace; assembly = MyNameSpace} BrushColorConverter'を作成できません。コンバーターと名前空間は私のコードビハインドと同じですが、別のアセンブリや何かにするために何かする必要がありますか? '; assembly = Templating'は私には何の意味もありません。私はステップを逃したのですか?または、私はxmlをロードするために別のものを使用する必要がありますか(最初のコードスニペットを参照してください).I couldntとして編集された前のコメントを追加しました –

+0

私の最後のコメントは、組み立ては完全なプロジェクト(あなたが定義した場所)を見ることなくそれらを見つけ出すことは不可能です。 –