모두. 객체의 XamDataGrid가 있습니다. 각 오브젝트에는 그리드 내에서 편집하려는 두 개의 특성이 있습니다. 가변 개수의 열을 허용하기 위해 프로그래밍 방식으로 FieldLayout을 만듭니다. 레이아웃을 정의 할 때 PropertyPath가 내 ViewModel의 특정 열을 가리킬 수 있도록 각 필드에 대한 바인딩을 설정할 수 있습니다 (예 : Path = "Columns [0]", Path = "Columns [1]"등) 이 잘 작동 :XamDataGrid에서 UnboundFields를 사용하여 템플릿 바인딩
내가 나를 각 필드를 편집 할 수 있도록하기 위해 CellValuePresenter에 템플릿을 적용하려면, 두 개의 각 필드에 바인딩 한 텍스트 상자에 :
로 템플릿 바인딩이 올바르지 않습니다. 지금 템플릿에 바인딩이 있습니다. (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;
}
}
}
}