Обновить стиль в сетке данных, связанной с датируемым WPF - PullRequest
2 голосов
/ 10 декабря 2010

У меня есть DataGrid, связанный с DataTable, а DataGrid имеет стиль ячейки, который изменяет Foreground чисел в ячейках в зависимости от его значения (положительный черный или отрицательный красный).Когда DataTable обновляется, DataGrid корректно обновляется, поэтому привязка работает нормально.Проблема в том, что Style применяется только тогда, когда DataGrid загружается в первый раз.Когда DataGrid обновляется привязкой, если отрицательное число становится положительным, Foreground остается красным, а не становится черным.

Я что-то упускаю, какую-то собственность или событие?

Заранее спасибо.

1 Ответ

1 голос
/ 10 декабря 2010

Я не уверен, как вы пытаетесь это сделать. Во всяком случае, я пытался, и он работает нормально. Проверьте этот код и выясните, что происходит не так

Xaml:

 <StackPanel Loaded="StackPanel_Loaded" >
    <StackPanel.Resources>
        <WpfApplication50:ValueToForegroundColorConverter x:Key="valueToForegroundColorConverter"/>
        <DataTemplate x:Key="Valuetemplate">
            <TextBlock x:Name="txt" Text="{Binding Value}" Foreground="{Binding Path=Value,Converter={StaticResource valueToForegroundColorConverter}}"/>
        </DataTemplate>
    </StackPanel.Resources>
    <dtgrd:DataGrid ItemsSource="{Binding Source}"  
                     Name="datagrid"                          
                     ColumnHeaderHeight="25" 
                     AutoGenerateColumns="False"   
                          >
        <dtgrd:DataGrid.Columns>
            <dtgrd:DataGridTemplateColumn CellTemplate="{StaticResource Valuetemplate}" Header="Value"/>
        </dtgrd:DataGrid.Columns>
    </dtgrd:DataGrid>
    <Button Height="30" Click="Button_Click"/>
</StackPanel>

и в вашем коде

 public partial class Window10 : Window,INotifyPropertyChanged
{  
    private DataTable source;
    public DataTable Source
    {
        get { return source; }
        set { source = value; OnPropertyChanged("Source"); }
    }
    public Window10()
    {
        InitializeComponent();
        this.DataContext = this;
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string name)
    {
        if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs(name));
    }

    #endregion

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Source.Rows.Add("-1");
    }

    private void StackPanel_Loaded(object sender, RoutedEventArgs e)
    {
        Source = new DataTable();
        Source.Columns.Add("Value");
        Source.Rows.Add("1");
    }
}

и этот конвертер

 class ValueToForegroundColorConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        SolidColorBrush brush = new SolidColorBrush(Colors.Black);
        int val = 0;
        int.TryParse(value.ToString(), out val);
        if (val < 0)
            brush = new SolidColorBrush(Colors.Red);
        return brush;
    }

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

    #endregion
}
...