如何将单个数据网格行FontWeights更改为Bold?

时间:2015-11-16 05:43:24

标签: c# wpf wpfdatagrid

当我的数据网格中选择了一行并按下了一个按钮时,我想将该行中单元格的FontWeight更改为粗体。

我一直在寻找一种方法来做到这一点,但我所能做的就是改变每一列的风格,我找不到一种方法来获取所选行(或任何行)。< / p>

我没有可以从ItemSource类型绑定的特定值,因此使用XAML和ValueConverter的解决方案由于复杂性增加而不受欢迎。也就是说,除非这是唯一的方式。

这就是我正在进行的工作:

 <DataGrid Name="dgSessions" Width="200" Height="100" 
                          CanUserAddRows="False" CanUserDeleteRows="False" 
                          HeadersVisibility="None" GridLinesVisibility="None" AutoGenerateColumns="False"
                          SelectionMode="Single" Background="White">
                    <DataGrid.Columns>
                        <DataGridTextColumn Width="*" Binding="{Binding Path=Name}"></DataGridTextColumn>
                    </DataGrid.Columns>
                    <DataGrid.CellStyle>
                        <Style TargetType="{x:Type DataGridCell}">
                            <Style.Setters>
                                <Setter Property="FontWeight"
                                        Value="Normal"/>
                            </Style.Setters>
                        </Style>
                    </DataGrid.CellStyle>
  </DataGrid>


        private void btnConnect_Click(object sender, RoutedEventArgs e)
    {
        Style oldStyle = dgSessions.SelectedCells.First().Column.CellStyle;
        Setter setter = null;
        foreach (Setter item in oldStyle.Setters)
        {
            if (item.Property.Name == "FontWeight")
            {
                setter = new Setter(item.Property, FontWeights.Bold, item.TargetName);
                break;
            }
        }
        Style newStyle = new Style(oldStyle.TargetType);
        newStyle.Setters.Add(setter);
        dgSessions.SelectedCells.First().Column.CellStyle = newStyle;


    }

2 个答案:

答案 0 :(得分:2)

您可以定义DataGridRow样式,如下所示,按钮点击设置属性以触发通知以在行上应用FontWeight

<Style x:Key="MyRowStyle" TargetType="DataGridRow">
    <Setter Property="FontWeight" Value="Normal"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsProcessed}" Value="True">
            <Setter Property="FontWeight" Value="Bold"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

DataGrid将定义为

<DataGrid RowStyle="{StaticResource MyRowStyle}" ...... />

现在要集成它,你必须在模型中定义属性,该属性绑定到ItemSource DataGrid(模型应该实现INotifyPropertyChanged接口)。单击按钮,设置在模型中定义的属性并绑定到DataTrigger

private void btnConnect_Click(object sender, RoutedEventArgs e)
{
     var dataContext = btnConnect.DataContext as <<Your Model>>;
     dataContext.IsProcessed = true;
}

答案 1 :(得分:2)

事实证明,你可以得到一行像这样的数据网格:

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(myIndex);

还有一种不同的方法可以从Item获取一行。

所以我做了以下操作以粗体设置我想要的行:

  1. 使用int index = myObservableCollection.IndexOf(myObject)检索索引 如果您有很多行,我认为索引始终无效 和虚拟化已启用,但根据我的上下文,没关系。

  2. 创建我的Setter

    Setter bold = new Setter(TextBlock.FontWeightProperty, FontWeights.Bold, null);
    
  3. 获取我的行:

    DataGridRow row = (DataGridRow)dgSessions.ItemContainerGenerator.ContainerFromIndex(index);
    
  4. 创建样式并设置它:

        Style newStyle = new Style(row.GetType());
    
        newStyle.Setters.Add(bold);
        row.Style = newStyle;