2015-11-17 10 views
2

У меня есть приложение WPF, где мне нужно разрешить изменение внешнего вида (фоны и передний план в основном). Поэтому я привязываю их к динамическим ресурсам, которые определены в масштабе всего приложения App.resources.SelectedColor binding не обновляется с ColorPicker до Model

Я также решил использовать ColorPicker из wpftoolkit (v2.5.0) в моем окне Настройки

setting window with colorPicker

упрощенный пример

app.xaml

<Application x:Class="WpfColors.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <SolidColorBrush x:Key="BgBrush" Color="Gray"/> 
    </Application.Resources> 
</Application> 

MainWindow.xaml с Color Picker

<Window x:Class="WpfColors.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid Name="grdBrushes" 
        Background="{DynamicResource ResourceKey=BgBrush}" 
        AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="*" Header="Element" Binding="{Binding Path=Name}"/> 

       <DataGridTemplateColumn Width="*" Header="Color"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <xctk:ColorPicker SelectedColor="{Binding Path=BrushColor, Mode=TwoWay}" 
               AvailableColorsHeader="Available" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid>   
    </Grid> 
</Window> 

MainWindow.cs

using System.Linq; 
using System.Windows; 
using System.Windows.Media; 

namespace WpfColors 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      var res = Application.Current.Resources; 
      grdBrushes.ItemsSource = res.Keys.OfType<string>() 
       .Select(resKey => new AppBrush(resKey, ((SolidColorBrush) res[resKey]).Color)) 
       .ToList(); 
     } 
    } 
} 

Кисть модели

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Media; 

namespace WpfColors 
{ 
    public class AppBrush : INotifyPropertyChanged 
    { 
     public AppBrush(string name, Color color) 
     { 
      Name = name; 
      _brushColor = color; 
     } 

     public string Name { get; set; } 

     private Color? _brushColor; 
     public Color? BrushColor 
     { 
      get { return _brushColor; } 
      set 
      { 
       // BREAKPOINT 
       _brushColor = value; 
       if (_brushColor.HasValue) 
        Application.Current.Resources[Name] = new SolidColorBrush(_brushColor.Value); 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("BrushColor")); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 
} 

Проблема заключается в том, что BreakPoint в AppBrush не ударил, когда я выбрать цвет , BrushColor привязан к ColorPicker SelectedColor. Если я меняю BrushColor, обновляется ColorPicker.

Это ошибка ColorPicker или моя? как я могу обновлять кисти приложений сразу после изменения выбора?

+0

Try установить SelectedColor = "{Binding Path = BrushColor, Mode = TwoWay, UpdateSourceTrigger = PropertChanged}" – Maximus

ответ

3

Предположительно он обновляет источник, но также, когда он теряет фокус или явно. Используйте

SelectedColor="{Binding Path=BrushColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"