Преобразовать y / n в true / false в XAML - PullRequest
0 голосов
/ 05 апреля 2019

Я использовал следующий код для предварительного выбора некоторых строк в списке:

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
       <Setter Property="IsSelected" Value="{Binding f_selected, Mode=OneWay}" />
    </Style>
</ListBox.ItemContainerStyle>

Значение f_selected в коде может быть только true или false, но в DB значения y / n.Я использовал трюк для преобразования y / n в true / false с помощью объекта, но более высокие руководители попросили меня работать только с y / n в объектах.Есть ли способ работать со строкой вместо bool или выполнять преобразование в XAML или viewmodel?

Спасибо за помощь и, как всегда, извините за плохой английский.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

В WPF вы можете использовать DataTrigger:

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding f_selected}" Value="y">
                <Setter Property="IsSelected" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListBox.ItemContainerStyle>

В UWP вы можете сделать то же самое, используя DataTriggerBehavior .

0 голосов
/ 05 апреля 2019

Примечание: ответ mm8 с использованием DataTrigger хорош, если вы разрабатываете приложение WPF.

В WPF и UWP вы можете создать собственную реализацию интерфейса IValueConverter, чтобы добиться этого практически с одним и тем же кодом. По сути, он преобразует ваш строковый ввод в логическое значение в зависимости от определенных вами правил.

WPF:

public class StringToBooleanConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString().Equals("y");
    }

    // This is not really needed because you're using one way binding but it's here for completion
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(value is bool)
        {
            return value ? "y" : "n";
        }
    }
}

UWP:

Приведенный выше код точно такой же, за исключением последнего параметра в методах Convert и ConvertBack:

public object Convert(object value, Type targetType, object parameter, string language) { }

public object ConvertBack(object value, Type targetType, object parameter, string language) { }

Следующее более или менее одинаково как для WPF, так и для UWP. Вы можете использовать конвертер в XAML для преобразования из строки в bool:

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
       <Setter Property="IsSelected" Value="{Binding f_selected, Mode=OneWay, Converter={StaticResource StringToBooleanConverter}}" />
    </Style>
</ListBox.ItemContainerStyle>

Также не забудьте представить конвертер в начале:

<Window.Resources>
    <local:YesNoToBooleanConverter x:Key="StringToBooleanConverter" />
</Window.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...