2016-06-08 8 views
0

У меня есть XamDataGrid с ObservableCollection элементов как DataSource. Элемент имеет два свойства A и B, а оба A и B имеют свойство Value. Я хочу привязать эти два свойства Value к моим двум полям.Использование сложных полей для XamDataGrid

Очевидно что-то вроде этого не работает:

<Field Name="A.Value"/> 

Я читал кое-что о AlternateBinding, но это не работает для меня тоже:

<Field AlternateBinding="A.Value"/> 

Я не нашел хороший учебник о том, как для использования AlternateBinding, поэтому я действительно не знаю, как его использовать.

EDIT:

Это работает, когда я использую UnboundField так:

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

Однако он говорит, что UnboundField является устаревшим, и я должен использовать поле. Хотел бы я знать, как это сделать.

ответ

1

Задайте свойства на своих Элементах общедоступными и установите имя полей в качестве имени вашего свойства.

Пример:

<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

Пожалуйста, еще раз взглянуть на мой вопрос. В вашем примере я не хочу связывать «Name», но «Name.Length», например. – gartenriese

+0

Вы можете открыть Name.Length как общедоступное свойство Item. Затем свяжите (просто объявляя) поле XamDataGrid с тем же именем для этого свойства. –

+0

Я искал способ привязать напрямую к ребенку, не создавая нового типа. Как будто с 'UnboundField'. – gartenriese