私は自動生成された列に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;
大規模なありがとう!
'のxmlns試してみてください:ローカル= "" CLR名前空間:RP_SIL.View;アセンブリ= RP_SIL ":ローカル= "" CLR名前空間:** 'のxmlns動作します。この' –
" RP_SIL.Viewを。 assembly = RP-SIL ""とすると、プロジェクトプロパティで正しいアセンブリ名を見つけることができます。この場合は、アンダースコアの代わりにドットが表示されます。今すぐ試してみてください、私の答えを受け入れる、ありがとう –