Как установить фон кнопки на основе свойства элемента - WPF - PullRequest
0 голосов
/ 07 мая 2020

Я создаю радиокнопки динамически, это означает, что я перебираю элементы своей базы данных, и я показываю стилизованные радиокнопки, а вот мой код:

public ObservableCollection<Product> products = new ObservableCollection<Product>(ProductsController.SelectAllProducts());

if (products.Count > 0)
{
    foreach(var item in products)
    {
        SolidColorBrush mySolidColorBrush = new SolidColorBrush();
        mySolidColorBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#004a80"));
        RadioButton a = new RadioButton();
        a.BorderThickness = new Thickness(1);
        a.Background = Brushes.Green;
        a.Foreground = new SolidColorBrush(Colors.Black);
        a.BorderBrush = mySolidColorBrush;
        a.Width = 118;
        a.Height = 70;
        a.Margin = new Thickness(5,0,0,5);
        Style style = Application.Current.Resources["MyRadioButtonAsButtonStyle"] as Style;
        a.Style = style;
        a.ApplyTemplate();
        a.Content = item.OrdinalNumber;
        Image imgControl = (Image)a.Template.FindName("img", a);
        Image imgControlWhite = (Image)a.Template.FindName("whiteImg", a);
        TextBlock text = (TextBlock)a.Template.FindName("text", a);

        if (fileNames.Count > 0)
        {
            if (!fileNames.Any(item.Description.Contains))
            {
                item.IsProcessed = true; // SETTING PROPERTY
            }
        }


        a.Click += (object sender, RoutedEventArgs e) =>
        {
            var radioButton = sender as RadioButton;
            MessageBox.Show(radioButton.Content.ToString());
        };
        text.Text = item.Title;
        imgControl.Source = image;
        spProducts.Children.Add(a);
    }
}

Я устанавливаю IsProcessed который Я хотел бы использовать, когда я устанавливаю фон этого переключателя, который имеет стиль кнопки.

Так, например, если IsProcessed = true я хотел бы установить Background на Green, иначе я бы хотел бы установить его на Red.

Вот мой класс:

enter code here publi c class Product: INotifyPropertyChanged {#region Attributes private string _ordinalNumber; частная строка _title; частная строка _description; private bool _isProcessed; # endregion

#region Properties
public string OrdinalNumber
{
    get { return _ordinalNumber; }
    set { _ordinalNumber = value; NotifyPropertyChanged("OrdinalNumber"); }
}
public string Title
{
    get { return _title; }
    set { _title = value; NotifyPropertyChanged("Title"); }
}
public string Description
{
    get { return _description; }
    set { _description = value; NotifyPropertyChanged("Description"); }
}

public bool IsProcessed
{
    get { return _isProcessed; }
    set
    {
        _isProcessed = value; NotifyPropertyChanged("IsProcessed");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

}

А вот мой собственный стиль, в котором я впервые установил фон (в зеленый):

  <Style x:Key="MyRadioButtonAsButtonStyle" TargetType="RadioButton">
            <Setter Property="FontSize" Value="15" />
            <Setter Property="GroupName" Value="Option" />
            <Setter Property="BorderThickness" Value="1.5" />
            <Setter Property="HorizontalContentAlignment" Value="Center" />
            <!-- and so on for each property...-->
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type RadioButton}">
                        <Border Height="{Binding ActualHeight, ElementName=parentStackPanel}" Width="{Binding ActualWidth, ElementName=parentStackPanel}" BorderBrush="#004a80" BorderThickness="{TemplateBinding BorderThickness}">
                            <Grid x:Name="gridProduct" Background="Green">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="80*"></RowDefinition>
                                    <RowDefinition Height="20*"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Image x:Name="slika" Margin="10" Grid.Row="0" Width="Auto" Visibility="Visible"/>
                                <TextBlock x:Name="tekst" Foreground="White" Margin="0,0,0,3" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12"></TextBlock>
                            </Grid>
                        </Border>

                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter TargetName="gridProduct" Property="Background" Value="Orange"/>
                                <Setter TargetName="tekst" Property="Foreground" Value="White"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Итак, в основном я Не знаю, как проверить значение item.IsProcessed в app.xaml, поэтому я мог бы каким-то образом добавить сеттер для фона в зависимости от этого значения опоры?

Любая помощь была бы отличной!

Спасибо!

1 Ответ

1 голос
/ 07 мая 2020

Как насчет добавления DataTrigger к вашему Style?:

<ControlTemplate.Triggers>
    <Trigger Property="IsChecked" Value="True">
        <Setter TargetName="gridProduct" Property="Background" Value="Orange"/>
        <Setter TargetName="tekst" Property="Foreground" Value="White"/>
    </Trigger>
    <DataTrigger Binding="{Binding IsProcessed}" Value="True">
        <Setter TargetName="gridProduct" Property="Background" Value="Green"/>
    </DataTrigger>
</ControlTemplate.Triggers>

Чтобы привязка работала, вы должны установить DataContext из RadioButton:

foreach (var item in products)
{
    ...
    a.DataContext = item;
    spProducts.Children.Add(a);
}

В общем, вы должны использовать ItemsControl, который привязывается к ObservableCollection<Product> и определяет RadioButton в ItemTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...