WPF: Получить свойство объекта (полученное из конвертера) через привязку - PullRequest
2 голосов
/ 20 апреля 2011

У меня такая ситуация: у меня есть перечисление, и я создаю сетку данных, состоящую из строк на основе каждого значения этого перечисления.

Я передаю значения перечисления в виде строк некоторым настроенным конвертерам, и все работает нормально.

Однако я попал в ситуацию, когда мне хотелось бы с помощью преобразователя вернуть объект и связать его свойство, а не сам объект. На самом деле я делаю это через параметр конвертера, но проблема в том, что с дизайнером эта штука не работает.

Вот несколько фрагментов кода:

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}}" />

Можно ли сделать что-то подобное?

1 Ответ

2 голосов
/ 20 апреля 2011

В этом случае я бы предложил использовать 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.

...