【问题标题】:WPF DataGridTextColumn FontWeight Binding / Value Converter not workingWPF DataGridTextColumn FontWeight 绑定/值转换器不起作用
【发布时间】:2020-09-30 12:46:47
【问题描述】:

我很了解绑定/值转换器的概念,但由于某些原因,以下绑定不起作用。我想将某些描述的FontWeight 更改为BoldDescription 是一个文本字段):

XAML:

<DataGridTextColumn Header="Description"
                    Binding="{Binding Description}"
                    FontWeight="{Binding Description, Converter={converters:DescriptionToFontWeightConverter}}"/>

值转换方法(简化):

public class DescriptionToFontWeightConverter : ConverterMarkupExtension<DescriptionToFontWeightConverter>
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Some logic based on the value
        // ..
        
        return "Bold"; // I believe I should use "Bold", and not "FontWeights.Bold" here (like it would be with a dependency property, but the problem is that it doesn't go inside the method.
    }

    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => Binding.DoNothing;
}

我认为问题出在 FontWeight 属性的绑定路径上。例如,如果我将(Path=)Description 替换为RelativeSource={RelativeSource Self},它会进入值转换器方法内部,但我认为我无法检索绑定的值。我认为这不是异常(至少是我没想到),但我想知道我是否不应该将DataGridTextColum 替换为DataGridTemplateColum 并进一步挖掘?

我使用 this website 中的 ConvertMarkupExtension 方法,它不需要将值转换器指定为静态资源。

更新DataGridColumnTemplate

<DataGridTemplateColumn Header="Description">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Description}">
                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="FontWeight"
                                Value="{Binding Description, Converter={converters:DescriptionToFontWeightConverter}}"/>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Description}"/>
        </DataTemplate>                    
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

感谢您的任何见解:-)

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    DataGridColumn 不继承任何 DataContext,因此尝试绑定到当前项目的 Description 属性总是会失败。

    Binding 属性很特殊。它的类型是Binding,您在 XAML 中定义的绑定最终将应用于在运行时创建的元素。对于DataGridTextColumn,这是TextBlockTextBox,具体取决于您是否处于编辑模式。

    但我想知道我是否不应该用 DataGridTemplateColum 替换 DataGridTextColum 并进一步挖掘

    如果您使用DataGridTemplateColumn 并在CellTemplate 中定义TextBlock(并在CellEditingTemplate 中定义TextBox),您实际上可以像往常一样绑定到当前项目的属性。这是因为模板中的元素被添加到元素树中并像任何其他元素一样继承DataContext

    【讨论】:

    • 好的,谢谢。我进行了修改(见更新),它完美地工作,但我不太确定我是否真的允许直接编辑。我真的不知道为什么,但有些东西阻止我“只是”尝试..
    • @Or8e4m4n:CellEditingTemplateTextBlock 将显示您处于编辑模式,所以这应该可以工作。
    猜你喜欢
    • 2018-03-26
    • 2011-04-16
    • 2011-03-07
    • 2012-01-06
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2013-12-10
    • 2010-11-06
    相关资源
    最近更新 更多