c# - TextBlock 的绑定(bind)标签

标签 c# wpf datagrid

我有一个 DataGrid,如下图所示:

enter image description here

在 DataGrid 中,第三级 Date 列是一个 DataGridTemplateColumn。

这是上面提到的日期列的代码:

<DataGridTemplateColumn Header="Date" Width="5*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding StringFormat='{}{0:dd/MM/yyyy}'}"
                       Tag= ?????? />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

正如上面代码中提到的,我想将 TextBlock 的 Tag 属性绑定(bind)到该列中同一日期的出现次数。

我想要的示例:

假设我有 5 行

   Date      |    Tag
-------------+----------
20/08/2012   |     1
20/08/2012   |     2
21/08/2012   |     1
23/08/2012   |     1
20/08/2012   |     3

假设您没有代码,那么请给我我将尝试自己编写代码的逻辑。

更新:上图中显示的数据网格的完整代码

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding DataContext.Patients, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
          SelectedItem="{Binding SelectedPatient}" RowDetailsVisibilityMode="VisibleWhenSelected"
          IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" >
    <DataGrid.Resources>
        <Style x:Key="VerticalCenter" TargetType="TextBlock">
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
        </Style>
        <Style x:Key="VerticalAndHorizontalCenter" TargetType="FrameworkElement" >
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="HorizontalAlignment" Value="Center"></Setter>
        </Style>
        <Style x:Key="VerticalAndHorizontalCenterTextBlock" TargetType="TextBlock"
               BasedOn="{StaticResource VerticalAndHorizontalCenter}"/>
        <Style x:Key="VerticalAndHorizontalCenterHeader" TargetType="{x:Type DataGridColumnHeader}" 
               BasedOn="{StaticResource VerticalAndHorizontalCenter}"/>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding PatientName}" Header="Patient Name" Width="25*" 
                            ElementStyle="{StaticResource VerticalCenter}"/>
        <DataGridTextColumn Binding="{Binding City}" Header="City" Width="15*" 
                            ElementStyle="{StaticResource VerticalAndHorizontalCenterTextBlock}" 
                            HeaderStyle="{StaticResource VerticalAndHorizontalCenterHeader}"/>
        <DataGridTextColumn Binding="{Binding TypeSex.Value}" Header="Sex" Width="10*" 
                            ElementStyle="{StaticResource VerticalAndHorizontalCenterTextBlock}"
                            HeaderStyle="{StaticResource VerticalAndHorizontalCenterHeader}"/>
        <DataGridTextColumn Binding="{Binding Age}" Header="Age" Width="5*" 
                            ElementStyle="{StaticResource VerticalAndHorizontalCenterTextBlock}" 
                            HeaderStyle="{StaticResource VerticalAndHorizontalCenterHeader}"/>
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Focusable="False" Command="{Binding DataContext.DeletePatientCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
                        <Image Source="Images/DeletePatient.png" />
                    </Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>

    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid AutoGenerateColumns="False" IsReadOnly="True" 
                      ItemsSource="{Binding DataContext.ReportNames, 
                                            RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
                      SelectedItem="{Binding DataContext.SelectedReportGroup, 
                                             RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
                      Margin="200,0,0,0" Width="500" HorizontalAlignment="Left">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding}" Header="Report Name" Width="5*" 
                                        ElementStyle="{StaticResource VerticalCenter}"/>
                    <DataGridTemplateColumn Header="Delete" Width="*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Focusable="False" Command="{Binding DataContext.DeleteAllReportsOfATypeCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
                                    <Image Source="Images/DeleteReport.png" Height="48" Width="48" />
                                </Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>

                <DataGrid.RowDetailsTemplate>
                    <DataTemplate>
                        <DataGrid AutoGenerateColumns="False" IsReadOnly="True"
                                  ItemsSource="{Binding DataContext.CorrespondingDates, 
                                                      RelativeSource={RelativeSource FindAncestor, 
                                                                      AncestorType=Window}}"
                                  SelectedItem="{Binding DataContext.SelectedReport,
                                                        RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                                  Width="390" HorizontalAlignment="Right">
                            <DataGrid.Columns>
                                <DataGridTemplateColumn Header="Date" Width="5*"
                                                    HeaderStyle="{StaticResource VerticalAndHorizontalCenterHeader}">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding StringFormat='{}{0:dd/MM/yyyy}'}"
                                                       Tag="{Binding DataContext.Tag,
                                                                     RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
                                                       Style="{StaticResource VerticalAndHorizontalCenterTextBlock}"/>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                                <DataGridTemplateColumn Header="Edit" Width="1.5*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Focusable="False" Click="OpenTabForEdit" 
                                                    Command="{Binding DataContext.EditSingleReportCommand,
                                                                      RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
                                                <Image Source="Images/EditReport.png" Height="48" Width="48" />
                                            </Button>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                                <DataGridTemplateColumn Header="Delete" Width="1.5*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Focusable="False" 
                                                    Command="{Binding DataContext.DeleteSingleReportCommand, 
                                                                      RelativeSource={RelativeSource AncestorType={x:Type Window}}}">
                                                <Image Source="Images/DeleteReport.png" Height="48" Width="48"/>
                                            </Button>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>

            </DataGrid>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>

</DataGrid>

更新 2:类结构

enter image description here

类似于 BloodChemistryUrineAnalysis

最佳答案

在我看来你需要一个 MultiBinding在这里,因为您有两个输入:整个集合和您要计算的特定日期。 XAML 语法如下所示:

<TextBlock>
    <TextBlock.Resources>
        <my:ItemCountMultiConverter x:Key="ItemCountMultiConverter" />
    </TextBlock.Resources>
    <TextBlock.Tag>
        <MultiBinding Converter="{StaticResource ItemCountMultiConverter}">
            <Binding Path="." />
            <Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType=DataGrid}"  />
        </MultiBinding>
    </TextBlock.Tag>
</TextBlock>

然后只需实现 ItemCountMultiConverter : IMultiValueConverter 即可从集合中提取日期计数:

public class ItemCountMultiConverter : IMultiValueConverter 
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null || values.Length < 2)
            return DependencyProperty.UnsetValue;

        var dateToCount = values[0] as DateTime?;
        var source = values[1] as IEnumerable<Patient>;

        if (!dateToCount.HasValue || source == null)
            return DependencyProperty.UnsetValue;

        source.Count(patient => 
            patient.Haemogram.Any(haemogram => haemogram.Date == dateToCount)
            || patient.UrineAnalysis.Any(urine => urine.Date == dateToCount)
            || patient.BloodChemistry.Any(blood => blood.Date == dateToCount)
        );
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

关于c# - TextBlock 的绑定(bind)标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662775/

相关文章:

c# - 继承泛型作为函数参数

c# - 在 ASP.NET Web API 2.2 中启用 OData v4.0 路由时遇到问题

c# - 将应用程序资源中的 DependancyProperty 绑定(bind)到控件 DependancyProperty(正在使用该资源)

wpf - 如何将工厂用于DataGrid.CanUserAddRows = true

c# - DataGridView 复选框列 "select all"性能

c# - 将两个属性绑定(bind)到 DataGridTemplateColumn TextBox WPF MVVM

c# - 动画列表框滚动

wpf - 在 DataGrid 中选项卡创建新行并聚焦新行

silverlight - 如何居中对齐 Silverlight 3 数据网格的页眉模板的内容?

c# - 使用 LINQ to SQL 的条件投影