WPF:通过绑定获取对象(从转换器获得)属性

本文关键字:转换器 属性 取对象 绑定 获取 WPF | 更新日期: 2023-09-27 17:50:42

我有这种情况:我有一个enum,我正在创建一个数据网格,由基于该enum的每个值的行组成。

我将枚举值作为字符串传递给一些自定义转换器,它工作得很好。

然而,我遇到了这样一种情况,我想用转换器返回一个对象并绑定它的属性,而不是对象本身。实际上,我是通过转换器参数来做这件事的,但问题是,在设计器中,这件事不起作用。

下面是一些代码:

XAML:

<DataGridTextColumn Header="Comments" Binding="{Binding Converter={specializedconverters:ButtonToButtonMacroConverter}, ConverterParameter=Comments, Mode=OneWay}" Width="*" />

转换器:

[ValueConversion(typeof(string), typeof(object))] 
internal class ButtonToButtonMacroConverter : BaseConverter, IValueConverter
{
    public ButtonToButtonMacroConverter() { }
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
            return "Data visible only at runtime";
        ButtonMacro macro = CurrentProfile.Profile.GetMacro((Buttons)Enum.Parse(typeof(Buttons), value as string));
        return macro.GetType().GetProperty(parameter as string).GetValue(macro, null);
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我想知道的是,是否有更好的方法来做到这一点,并在设计时看到它。我想通过转换器返回对象本身(ButtonMacro)并访问它在绑定中的属性,如Path=Comments(这是ButtonMacro的属性)

的例子:

<DataGridTextColumn Header="Comments" Binding="{Binding Converter={specializedconverters:ButtonToButtonMacroConverter}, Path=Comments, Mode=OneWay}" Width="*" />

这样的事情可能吗?

更新1:

<TextBlock Text="{Binding Source={Binding Converter={specializedconverters:ButtonToButtonMacroConverter}, Mode=OneWay}, Converter={converters:ObjectToStringConverter}}" />

有可能这样做吗?

WPF:通过绑定获取对象(从转换器获得)属性

在这种情况下,我建议使用DataGridTemplateColumn:

    <DataGrid AutoGenerateColumns="False" Height="200" Name="dataGrid1" Width="200">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Tag="{Binding Path=MyBrush, Converter={StaticResource myBrushConverter}}" 
                                       Text="{Binding RelativeSource={RelativeSource Self}, Path=Tag.Color}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
MyBrushConverter返回SolidColorBrush。DataGridTextColumn没有Tag属性