WPF XCEED DataGrid在一列中有多个属性

时间:2013-03-15 11:57:44

标签: wpf datagrid

我有一个有两个级别的集合的类。该软件是关于工资支付。这个想法是由多个付费员工组成的付款行动。每个员工都可以减少多个工资。对象看起来像:

Payment -->Payment Object
  Date
  ID
  Employees: -->ObservableCollection of EmpPayment Objects
     Emp A   -->And EmpPayment Object
        Name
        TotalCut --> An Integer Readonly Property that sums the Cuts.
        Cuts   --> Collection of Cut object
           Cut1  --> Cut object 1
           Cut2  --> Cut object 2
     Emp B
        Name
        TotalCuts
        Cuts
           Cut1
           Cut2

我正在使用超过DataGrid。到目前为止,除了我想使用CellContentTemplate在一列中显示两个值,即Cuts和TotalCut之外。所以datagrid看起来像:

Employee | Cuts
Emp A    | [The Total Cut]
           Cut 1
           Cut 2
Emp B    | [The Total Cut]
           Cut 1
           Cut 2

在剪切列中,我想使用Xceed DropDownButton来显示总数,用户可以通过编辑dropdowncontent来编辑剪切。到目前为止,我为Employees ObservableCollection制作了XAML:

<xcdg:DataGridControl x:Name="GridEmployees" ItemsSource="{Binding Employees}" AutoCreateColumns="False">
    <xcdg:DataGridControl.Columns>
        <xcdg:Column FieldName="Name" Title="Employee"/>

        <xcdg:Column FieldName="Cuts" Title="Cuts">
            <xcdg:Column.CellContentTemplate>
                <DataTemplate>
                    <xctk:DropDownButton Content="{Binding Path=TOTALCUT}">
                        <xctk:DropDownButton.DropDownContent>
                            <ListBox ItemsSource="{Binding}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBox Text="{Binding CutDescription}"/>
                                            <TextBox Text="{Binding Amount}"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </xctk:DropDownButton.DropDownContent>
                    </xctk:DropDownButton>
                </DataTemplate>
            </xcdg:Column.CellContentTemplate>
        </xcdg:Column>

    </xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>

绑定到Cuts ObservableCollection运行良好,但不是TotalCut。如何将TotalCut [有意写在上面的所有大写]中绑定到同一列? 可以使用两列,但不会很漂亮。

2 个答案:

答案 0 :(得分:3)

忘记XCeed DataGridControl并欢迎使用标准DataGrid。只需在那里使用DataGridTemplateColumn。

另一个选择就是在XCeed DataGridControl中使用两列,这是不可取的。

答案 1 :(得分:1)

您需要做的就是 - 提供您自己的单元格编辑器和CellTemplate,它们将绑定到相应的属性。这是我的工作解决方案:

    <xcdg:DataGridControl AutoCreateColumns="False" ItemsSource="{Binding Items}">
    <xcdg:DataGridControl.View>
        <xcdg:TableflowView ScrollingAnimationDuration="0" ContainerHeight="44"/>
    </xcdg:DataGridControl.View>
    <xcdg:DataGridControl.Resources>
        <DataTemplate x:Key="EditDataTemplate"  DataType="wpfApplication1:State">
            <StackPanel>
                <TextBox Text="{Binding Path=Name}"/>
                <TextBox Text="{Binding Path=Post}"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="ReadDataTemplate"  DataType="wpfApplication1:State">
            <StackPanel>
                <TextBlock HorizontalAlignment="Right" Text="{Binding Path=Name}"/>
                <TextBlock HorizontalAlignment="Right" Text="{Binding Path=Post}"/>
            </StackPanel>
        </DataTemplate>
    </xcdg:DataGridControl.Resources>
    <xcdg:DataGridControl.Columns>
        <xcdg:Column FieldName="Zip" Title="Zip"/>
        <xcdg:Column FieldName="Stat" Title="Zip2"
                     CellContentTemplate="{StaticResource ReadDataTemplate}">
            <xcdg:Column.CellEditor>
                <xcdg:CellEditor EditTemplate="{StaticResource EditDataTemplate}"/>
            </xcdg:Column.CellEditor>
        </xcdg:Column>    
    </xcdg:DataGridControl.Columns>
</xcdg:DataGridControl>

和“数据对象”的代码隐藏:

public class User
{
    private string _zip;

    public string Zip
    {
        get { return _zip; }
        set
        {
            _zip = value;
            Stat = new State();
            Stat.Name = "stat: " + value;
        }
    }

    public State Stat { get; set; }
}

public class State
{
    public string Name { get; set; }
    public string Post { get; set; }
}

Entire solution code