2016-06-08 16 views
0

Ich habe ein XamDataGrid mit einer ObservableCollection von Elementen als DataSource. Ein Element hat zwei Eigenschaften A und B und sowohl A als auch B haben eine Value-Eigenschaft. Ich möchte diese beiden Value-Eigenschaften an meine beiden Felder binden.Verwenden Sie komplexe Felder für XamDataGrid

Offensichtlich so etwas wie das funktioniert nicht:

<Field Name="A.Value"/> 

las ich etwas über AlternateBinding, aber das ist für mich nicht funktioniert entweder:

<Field AlternateBinding="A.Value"/> 

Ich habe kein gutes Tutorial gefunden, wie AlternativeBinding zu verwenden, also weiß ich nicht wirklich, wie man es benutzt.

EDIT:

Es funktioniert, wenn ich eine UnboundField wie diese bin mit:

<UnboundField Name="Value" BindingPath="A.Value" BindingMode="TwoWay"/> 

aber sie sagt, dass UnboundField veraltet und ich sollte Feld verwenden. Ich wünschte ich wüsste wie.

Antwort

1

Legen Sie die Eigenschaften für Ihre Elemente als öffentlich fest und legen Sie den Namen der Felder als den Namen Ihrer Eigenschaften fest.

Beispiel:

<Window x:Class="WPFXamDataGrid.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-mpatibility/2006" 
      xmlns:igDP="http://infragistics.com/DataPresenter" 
      xmlns:local="clr-namespace:WPFXamDataGrid" 
      mc:Ignorable="d" 
      Title="MainWindow" Height="350" Width="525"> 
     <Grid> 
      <igDP:XamDataGrid x:Name="xamDataGrid" Loaded="XamDataGrid_Loaded"> 
       <igDP:XamDataGrid.FieldLayouts> 
        <igDP:FieldLayout> 
         <igDP:Field Name="Name"/> 
         <igDP:Field Name="Date"/> 
        </igDP:FieldLayout> 
       </igDP:XamDataGrid.FieldLayouts> 
      </igDP:XamDataGrid> 
     </Grid> 
    </Window> 


using System; 
using System.Collections.ObjectModel; 
using System.Windows; 

namespace WPFXamDataGrid 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void XamDataGrid_Loaded(object sender, RoutedEventArgs e) 
     { 
      ObservableCollection<Item> list = new ObservableCollection<Item>(); 

      list.Add(new Item {Name = "First", Date = DateTime.Now}); 
      list.Add(new Item { Name = "Second", Date = ateTime.Now.AddDays(-1); 

      xamDataGrid.DataSource = list; 
     } 
    } 

    class Item 
    { 
     public string Name { get; set; } 
     public DateTime Date { get; set; } 
    } 
} 

EDIT ONE:

<Style x:Key="CellStyle" TargetType="{x:Type igDP:CellValuePresenter}"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type igDP:CellValuePresenter}}}"> 
         <TextBlock Text="{Binding Path=Value.Length}" FontWeight="Bold" /> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
</Style> 

<igDP:Field Name="Name" CellValuePresenterStyle="{StaticResource CellStyle}"/> 
+0

haben Sie einen anderen Blick auf meine Frage. In meinem Beispiel möchte ich zum Beispiel nicht 'Name', sondern 'Name.Length' binden. – gartenriese

+0

Sie können Name.Length als öffentliche Eigenschaft von Item verfügbar machen. Dann binden Sie (einfach deklarieren) ein Feld von XamDataGrid mit demselben Namen an diese Eigenschaft. –

+0

Ich suchte nach einer Möglichkeit, direkt an das Kind zu binden, ohne jedoch einen neuen Typ zu erstellen. Ein bisschen wie mit einem 'UnboundField'. – gartenriese