Цвет TextBlock в зависимости от значения перечисления - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над WPF с моделью MvvM.

У меня есть представление, содержащее Texblocks. Отображает информацию об идентификаторе (из документа и из базы данных):

<GroupBox Grid.Row="1" Grid.Column="0" Header="ID Informations">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="DataBase surname: "/>
        <TextBlock Text="{Binding Model.Db_SURNAME}" FontWeight="Bold"/>
        <TextBlock Text="Document surname: "/>
        <TextBlock Text="{Binding Model.Dc_SURNAME}" FontWeight="Bold"/>
        <TextBlock Text="DataBase forename: "/>
        <TextBlock Text="{Binding Model.Db_FORENAME}" FontWeight="Bold"/>
        <TextBlock Text="Document forename: "/>
        <TextBlock Text="{Binding Model.Dc_FORENAME}" FontWeight="Bold"/>
    </StackPanel>
</GroupBox>

У меня есть enum, содержащий код ошибки:

[Flags]
public enum errorID
{
    OK = 1<<0,
    SURNAME_DIFF = 1 << 1,
    FORENAME_DIFF = 1 << 2
}

И моя модель написана так:

private String _db_SURNAME;
public String Db_SURNAME
{
    get { return _db_SURNAME; }
    set { SetProperty(ref _db_SURNAME, value); }
}
[...]

private errorID _errorID;
public errorID ErrorID
{
    get { return _errorID; }
    set { SetProperty(ref _errorID, value); }
}

Я хочу, чтобы оба моих текстовых блока, отображающие Model.Db_SURNAME и Model.Dc_SURNAME, были окрашены в красный цвет при ErrorID.HasFlag(errorID.SURNAME_DIFF ). А также для Forname.

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Используйте конвертер, который преобразует ваше перечисление в цвет, подобный следующему:

public class ErrorIdColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(!(value is errorID))
             throw new ArgumentException("value not of type errorID");
        if(!(parameteris errorID))
             throw new ArgumentException("parameter not of type errorID");

        errorID error = (errorID)value;
        errorID flag = (errorID)parameter;

        if (error.HasFlag(flag))
        {
            return Brushes.Red;
        }
        ...

        return Brushes.Black;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
   ....
}

}

Затем вы можете привязать основной цвет к вашему перечислению с помощью конвертера:

<TextBlock Text="{Binding Model.Db_SURNAME}" FontWeight="Bold" Foreground={Binding Model.errorId, Converter={StaticRessource errorIDColorConverter}, ConverterParameter={StaticRessource errorID.SURNAME_DIFF}}/>
0 голосов
/ 11 сентября 2018

Я бы посоветовал вам выбрать DataTrigger в вашем ErrorID свойстве Model.

Попробуйте что-то вроде этого:

  1. Добавитьпространство имен вашего enum для вашего View (Visual Studio поможет вам получить его правильное значение)

    <UserControl [some other namespaces] 
                 xmlns:someName="clr-namespace:YourEnumNamespace;assembly=YourAssembly"> 
    
  2. Добавить стиль для вашего TextBox (вы можете установить его длявыполнив все это одновременно, или добавьте x:Key к ссылочному стилю явно для каждого TextBox, который вы хотите иметь):

    <UserControl.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding [your property to bind]}" Value="{x:Static someName:ErrorID.[value of enum]}">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
            </Style.Triggers>
            <!-- repeat data triggers for each enum value you want to check !-->
        </Style>
    </UserControl.Resources>
    

Или перейдите к конвертеру,но я лично предпочитаю такой подход.

Если подход с использованием этого стиля в UserControl.Resources не будет работать для вас, потому что вы не можете связывать таким образом, просто поместите его в свой тег TextBox.Style вваш TextBox.

0 голосов
/ 11 сентября 2018

Самое простое решение: переплет Foreground Цвет по значению ErrorID

XAML

<TextBlock Text="{Binding Model.Db_SURNAME}" FontWeight="Bold" Foreground={Binding SurNameColor}/>
<TextBlock Text="Document surname: "/>
<TextBlock Text="{Binding Model.Dc_SURNAME}" FontWeight="Bold" Foreground={Binding SurNameColor}/>

Модель

private Brush _surNameColor = Brush.Black;
public Brush SurNameColor
{
    get { return _surNameColor; }
    set { SetProperty(ref _surNameColor, value); }
}
private errorID _errorID;
public errorID ErrorID
{
    get { return _errorID; }
    set { 
        if(ErrorID.HasFlag(errorID.SURNAME_DIFF))
            SurNameColor = Brushes.Red;
        SetProperty(ref _errorID, value); }
}
...