全て。オブジェクトの XamDataGrid があります。各オブジェクトには、グリッド内で編集したい 2 つのプロパティがあります。さまざまな数の列を許可するために、プログラムで FieldLayout を作成しています。レイアウトを定義するときに、各フィールドのバインディングを設定して、PropertyPath が ViewModel の特定の列を指すようにすることができます ((つまり、Path="Columns[0]"、Path="Columns[1]" など)。正常に動作します:
テンプレートを CellValuePresenter に適用して、2 つのフィールドのそれぞれに 1 つのテキスト ボックスをバインドして、各フィールドを編集できるようにします。
ご覧のとおり、テンプレート バインディングは正しくありません。現在、各列のインデックスをテンプレートに取得する簡単な方法がわからないため、テンプレートには列の 1 つ (Path="DataItem.Columns[0]") へのバインドがあります。私が本当に欲しいのは、CellValuePresenter が FieldLayout で定義された正しいバインド オブジェクトを取得することですが、各テキスト ボックスを適切なプロパティにバインドすることです。
どんな助けでも大歓迎です。ありがとう、エド
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:igWPF="http://schemas.infragistics.com/xaml/wpf"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<local:InfoConverter x:Key="InfoConverter" />
<Style TargetType="{x:Type igWPF:CellValuePresenter}" x:Key="InfoStyle">
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type igWPF:CellValuePresenter}">
<StackPanel>
<Border BorderBrush="Black" BorderThickness="2">
<StackPanel>
<StackPanel Orientation="Vertical">
<Label Content="Name:" />
<TextBox Text="{Binding Path=DataItem.Columns[0], ConverterParameter=name, Converter={StaticResource InfoConverter}}"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label Content="Age:" />
<TextBox Text="{Binding Path=DataItem.Columns[0], ConverterParameter=age, Converter={StaticResource InfoConverter}}"/>
</StackPanel>
</StackPanel>
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</Window.Resources>
<Grid>
<igWPF:XamDataGrid x:Name="Grid" DataSource="{Binding Rows, Mode=TwoWay}">
<igWPF:XamDataGrid.FieldLayouts>
<igWPF:FieldLayout>
<igWPF:FieldLayout.Fields>
</igWPF:FieldLayout.Fields>
</igWPF:FieldLayout>
</igWPF:XamDataGrid.FieldLayouts>
<igWPF:XamDataGrid.FieldLayoutSettings>
<igWPF:FieldLayoutSettings SelectionTypeCell="Single" SelectionTypeRecord="Single" AutoGenerateFields="False"/>
</igWPF:XamDataGrid.FieldLayoutSettings>
</igWPF:XamDataGrid>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace WpfApplication2
{
class InfoConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string mode = parameter as string;
Info info = value as Info;
if (mode != null && info != null)
{
if (mode.Equals("name"))
{
return info.Name;
}
else if (mode.Equals("age"))
{
return info.Age;
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
}
}
using Microsoft.Practices.Prism.ViewModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApplication2
{
public class RowViewModel :NotificationObject
{
public RowViewModel(params Info[] info) : base()
{
foreach (Info i in info){
Columns.Add(i);
}
}
private ObservableCollection<Info> columns = new ObservableCollection<Info>();
public ObservableCollection<Info> Columns
{
get
{
return columns;
}
set
{
columns = value;
RaisePropertyChanged("Columns");
}
}
}
public class TableViewModel :NotificationObject
{
public TableViewModel() : base()
{
Rows.Add(new RowViewModel(new Info("A", 1), new Info( "B", 2), new Info("C", 3)));
Rows.Add(new RowViewModel(new Info("D", 4), new Info( "E", 5), new Info("F", 6)));
Rows.Add(new RowViewModel(new Info("G", 7), new Info("H", 8), new Info("I", 9)));
}
private ObservableCollection<RowViewModel> rows = new ObservableCollection<RowViewModel>();
public ObservableCollection<RowViewModel> Rows
{
get
{
return rows;
}
set
{
rows = value;
RaisePropertyChanged("Rows");
}
}
}
public class Info
{
public Info(string name, int age)
{
this.Name = name;
this.Age = age;
}
public override string ToString()
{
return Name + " " + Age;
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private int _age;
public int Age
{
get
{
return _age;
}
set
{
this._age = value;
}
}
}
}