Binding Background Color стиля из класса

В моем приложении у меня есть ColorToBrushConverter.cs, ColorItem.cs и страница коробки, которая содержит некоторую коллекцию цветов, когда пользователь нажимает на любой цвет и возвращается на главную страницу, он сохраняет в изолированном хранилище настроек, а затем я могу установить свою стековую панель любого фона любого элемента чтобы выбрать цвет из этой страницы colorbox.

Но проблема в том, что у меня есть стиль, в котором я хочу привязку цвета, поэтому мы можем сделать это из C# или использовать привязку цвета в xaml снизу класса.

ColorToBrushConverter.cs

namespace CustomColorsPicker.Converters
{
    public class ColorToBrushConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                return new SolidColorBrush((Color)(value));
            } 
            return null;
        }

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

ColorItem.cs

namespace ColorBox
{
    public class ColorItem
    {        
        public Color Color { get; set; }
    }
}

BoxPage.Xaml

содержит список цветов

xmlns:converters="clr-namespace:CustomColorsPicker.Converters"
<Page.Resources>
    <converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
</Page.Resources>

//////////

<ListBox Grid.Row="2" Name="listBox" ScrollViewer.VerticalScrollBarVisibility="Disabled" SelectionChanged="lstColor_SelectionChanged" Width="460" Height="770" Margin="0,20,0,0"> 
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel x:Name="item" Orientation="Horizontal" Margin="10,10,0,0">
                <Border CornerRadius="5" BorderThickness="2" BorderBrush="{Binding Color, Converter={StaticResource ColorToBrushConverter}}">
                    <Rectangle Fill="{Binding Color, Converter={StaticResource ColorToBrushConverter}}" Width="50" Height="50" />
                 </Border>
             </StackPanel>
         </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

BoxPage.xaml.cs

//Constructor. list of colors
static uint[] uintColors =
{
    0xFFD9325D,
    0xFFFFFF00,0xFFFFE135,0xFFFFFF66,0xFFF8DE7E,0xFF008000,0xFF008A00            
};

public BoxPage()
{
    InitializeComponent();           
    this.Loaded += BoxPage_Loaded;
}

private async void BoxPage_Loaded(object sender, RoutedEventArgs e)
{
    List<ColorItem> item = new List<ColorItem>();
    for (int i = 0; i < 67; i++)
    {
        item.Add(new ColorItem() { Color = ConvertColor(uintColors[i])});
    };
    listBox.ItemsSource = item;
}

private void lstColor_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0)
    {
        (Application.Current as App).CurrentColorItem = ((ColorItem)e.AddedItems[0]);                
    }
}

MainPage.xaml.cs

//Constructor
IsolatedStorageSettings ColourSettings = IsolatedStorageSettings.ApplicationSettings;

public MainPage()
{
    InitializeComponent();
    InitializeSettings();
}

private void InitializeSettings()
{
    if (!ColourSettings.Contains("LastColorItem"))
    {
        ColorItem item = new ColorItem();
        item.Color = Colors.Cyan;
        ColourSettings.Add("LastColorItem", item);                
    }
}


protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);
    ColourSettings["LastColorItem"] = _colorItem;
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    if (ColourSettings.Contains("LastColorItem"))
    {
        _colorItem = (ColorItem)ColourSettings["LastColorItem"];
    }

    ColorItem myColorItem = (Application.Current as App).CurrentColorItem;
    if (myColorItem != null)
    {
        _colorItem = (ColorItem)myColorItem;
    }

    MyFillStackPanel.Background = new SolidColorBrush(_colorItem.Color);
    MyCtrlPanelBorder.Background = new SolidColorBrush(_colorItem.Color);                       
}

MainPage.xaml

xmlns:converters="clr-namespace:CustomColorsPicker.Converters"
<Page.Resources>
    <converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
</Page.Resources>

В одном из моих стилей я хочу связать его с вышеуказанным цветом, потому что я не могу сделать или изменить стиль в C#

//SomeStyle
<DiscreteObjectKeyFrame.Value>
    <SolidColorBrush Color="{**i want to bind color here**}"/>
</DiscreteObjectKeyFrame.Value>

1 ответ

Решение

Предполагая, что ваш конвертер работает правильно, на самом деле в вашем коде отсутствует процесс связывания.

Ваш класс ColorItem (который должен быть производным от интерфейса INotifyPropertyChanged) должен объявить событие PropertyChanged. Когда ваше свойство Color изменяется, вы хотите вызвать событие, поэтому пользовательский интерфейс получает уведомление о том, что свойство Color было обновлено.

Вы делаете это по соглашению, вызывая метод с тем же именем, что и у вашего обработчика событий с префиксом "On", поэтому вам придется реализовать метод OnPropertyChanged, который, как я упоминал, будет отвечать за фактическое создание события PropertyChanged.

Есть много способов определить эту реализацию, но вы можете посмотреть здесь, чтобы увидеть реализацию от самих Microsoft. введите описание ссылки здесь

Выставьте свою собственность,

public ColorItem MyColor {get;set;}

поэтому, когда вы определите свой {Binding ...}, CLR сможет найти свойство во время выполнения.

В конструкторе MainPage вы можете инициализировать это свойство

MyColor = new ColorItem();

И определите DataContext страницы как:

this.DataContext = MyColor;

Теперь вы должны иметь возможность обновить исходный код цели с помощью кода, который вы определили. Если вы хотите, чтобы ваш пользовательский интерфейс распространял изменения на источник, вы должны определить Binding с Mode = TwoWay, поскольку режим по умолчанию для Binding - Mode=OneWay

редактировать

public class ColorItem: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
        public Color color
        {
            get
            {
                return _color;
            }
            set
            {
                _color = value;
                this.OnPropertyChanged();
            }
        }

        public void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            // Raise the PropertyChanged event, passing the name of the property whose value has changed.
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Выставьте свойство и установите его как DataContext вашей страницы. Затем ссылайтесь на него в Binding by {Binding MyColor.color....}

Другие вопросы по тегам