对XamDataGrid使用复杂字段

时间:2016-06-08 14:10:34

标签: c# wpf xaml observablecollection xamdatagrid

我有一个XamDataGrid,其ObservableCollection为Items作为DataSource。 Item有两个属性A和B,A和B都有Value属性。我想将这两个Value属性绑定到我的两个Fields。

显然这样的事情不起作用:

<Field Name="A.Value"/>

我读了一些关于AlternateBinding的内容,但这对我来说也不起作用:

<Field AlternateBinding="A.Value"/>

我还没有找到关于如何使用AlternateBinding的好教程,所以我真的不知道如何使用它。

修改

当我使用UnboundField时,它会起作用:

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

但是它说UnboundField已弃用,我应该使用Field。我希望我知道如何。

2 个答案:

答案 0 :(得分:1)

将Items上的属性设置为公共,并将Fields的名称设置为属性的名称。

示例:

    <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; }
    }
}

编辑一个:

<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}"/>

答案 1 :(得分:1)

实际上,您几乎明白了。

<Field Name="Test" AlternateBinding="{Binding A.Value}"/>