Как впоследствии обновить радиокнопку - PullRequest
0 голосов
/ 05 мая 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);
        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);
    }
}

В начале своего класса я получаю все продукты из Db, и я создал столько переключателей, сколько есть продуктов, и это выглядит так:

Если products.Count равно 8, мы увидим 8 переключателей, которые стилизованы под кнопки:

enter image description here

Спустя какое-то время я хотел бы изменить цвет фона или заголовок на переключателе, но я не хотел бы обновлять sh весь экран, поэтому я добавил INotifyPropertyChanged, а продукт - список типа Product, который выглядит так:

public class Product : INotifyPropertyChanged
{
    #region Attributes
    private string _ordinalNumber;
    private string _title;
    private string _description;
    #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 event PropertyChangedEventHandler PropertyChanged;

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

И где-то в моем коде в том же файле я пытался изменить заголовок:

var dbProduct = ProductController.Instance.GetProductByTitle(title);

var listItem = products.FirstOrDefault(x => x.OrdinalNumber == dbProduct.OrdinalNumber);
listItem.Title = "Test";

Но ничего не произошло, я думал, так как products был источником для создания переключателей, поэтому, если я изменю Title какого-либо элемента в этом списке, это повлияет на переключатель на экране, поскольку я использую эту Title опору, пока я показываю текст переключателя .

Любая помощь будет будь классным.

1 Ответ

2 голосов
/ 05 мая 2020

Вам необходимо создать привязку для отслеживания изменений в пользовательском интерфейсе. Примерно так:

Вместо -

text.Text = item.Title;

Получите это -

Binding binding = new Binding("Title");
binding.Source = item;
BindingOperations.SetBinding(text, TextBlock.TextProperty, binding);
...