Изменить подсказку для кнопки со стилем - WPF - PullRequest
0 голосов
/ 05 мая 2018

У меня есть DataGrid, загруженный со списком объектов, которые имеют свойство bool IsAutomaticSell. Мне нужно, чтобы при изменении значения всплывающая подсказка кнопки этой строки обновлялась. У меня есть следующий код, но он не работает. Thx

View.xaml

<DataGridTextColumn Header="Code"
                    Binding="{Binding Code}" />
<DataGridTemplateColumn Header="Actions"
                        Width="150">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal"
                        HorizontalAlignment="Center">
                <Button Command="{Binding DataContext.AutomaticSellCommand,
                        RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                        CommandParameter="{Binding}"
                        Padding="10"
                        Margin="0,2,2,2">
                    <iconPacks:PackIconModern Kind="CurrencyDollar" />
                    <Button.Style>
                        <Style TargetType="{x:Type Button}"
                               BasedOn="{StaticResource AccentedSquareButtonStyle}">
                            <Setter Property="ToolTip"
                                    Value="DEFAULT_TOOLTIP" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsAutomaticSell, UpdateSourceTrigger=PropertyChanged}"
                                             Value="True">
                                    <Setter Property="ToolTip"
                                            Value="NEW_TOOLTIP" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

ViewModel.cs

public ICommand AutomaticSellCommand => _automaticSellCommand ??
                         (_automaticSellCommand = new RelayCommand<OrderStatusDataWrapper>(AutomaticSell));

private static void AutomaticSell(OrderStatusDataWrapper orderStatusData)
{
    orderStatusData.IsAutomaticSell = !orderStatusData.IsAutomaticSell;
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вам нужно реализовать ValueConverter, чтобы заставить это работать.

ValueConverter позволит вам обрабатывать то, что отображать на основе вашего логического значения.

* MSDN 1006 *

public class BoolToContentConverter : IValueConverter
{
    public BoolToContentConverter()
    {
        TrueContent = "True Tool Tip";
        FalseContent = "False Tool Tip";
        NullContent = "No Value";
    }

    public object TrueContent { get; set; }
    public object FalseContent { get; set; }
    public object NullContent { get; set; }

    public object Convert(object value, Type targetType, 
           object parameter, CultureInfo culture)
    {
        if (value == null)
            return NullContent;

        bool boolValue = true;
        bool isBool = true;

        try
        {
            boolValue = (bool) value;
        }
        catch
        {
            isBool = false;
        }

        if (!isBool)
            return NullContent;

        return boolValue ? TrueContent : FalseContent;
    }

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

В вашем XAML вам нужно реализовать этот конвертер.

<Window x:Class="Example.MainWindow"
    ...
    xmlns:l="clr-Example"
    ...>
    <Window.Resources>
        <l:BoolToContentConverter x:Key="converter" />
    </Window.Resources>
    ...
        <DataGridTextColumn Header="Code"
                Binding="{Binding Code}" />
            <DataGridTemplateColumn Header="Actions"
                                    Width="150">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"
                                    HorizontalAlignment="Center">
                            <Button Command="{Binding DataContext.AutomaticSellCommand,
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                    CommandParameter="{Binding}"
                                    Padding="10"
                                    Margin="0,2,2,2">
                                <iconPacks:PackIconModern Kind="CurrencyDollar" />
                                <Button.Style>
                                    <Style TargetType="{x:Type Button}"
                                           BasedOn="{StaticResource AccentedSquareButtonStyle}">
                                        <Setter Property="ToolTip"
                                                Value="DEFAULT_TOOLTIP" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding IsAutomaticSell, UpdateSourceTrigger=PropertyChanged}"
                                                         Value="True">
                                                <Setter Property="ToolTip"
                                                        Value="{Binding IsAutomaticSell, Converter={StaticResource converter}}" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Button.Style>
                            </Button>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

    ....
</Window>

Надеюсь, это ответит на ваш вопрос. Ура! * * 1013

0 голосов
/ 05 мая 2018

Подсказка для привязки.

XAML:

 <Button ToolTip={Binding ToolTip}" ... />

ViewModel:

public string ToolTip => (IsAutomaticSell) ? "DEFAULT_TOOLTIP" : "NEW_TOOLTIP";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...