2013-07-18 3 views
1

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

http://imgur.com/rJLCKiR

내가 나를 각 필드를 편집 할 수 있도록하기 위해 CellValuePresenter에 템플릿을 적용하려면, 두 개의 각 필드에 바인딩 한 텍스트 상자에 :

http://imgur.com/9IEq1Du

로 템플릿 바인딩이 올바르지 않습니다. 지금 템플릿에 바인딩이 있습니다. (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; 
       } 
      } 
     } 
} 

답변

1

편집 : 나는 그것을 알아 냈다! 난 그냥 CellValuePresenter의 값에 바인딩합니다.

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igWPF:CellValuePresenter}}, Path=Value.Age}"/> 
:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type igWPF:CellValuePresenter}}, Path=Value, ConverterParameter=name, Converter={StaticResource InfoConverter}}"/> 

지옥, 난 변환기가 필요하지 않습니다