WPF的DataGrid下DataGridCell绑定Brush报错的问题

2020-12-23 02:26

阅读:438

标签:null   ora   pen   horizon   mat   text   main   count   targe   

界面上有个DataGrid,xaml如下

 1 Window x:Class="WTest.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:WTest"
 7         mc:Ignorable="d"
 8         Title="MainWindow" Height="450" Width="800">
 9     Window.Resources>
10         Style TargetType="DataGridCell">
11             Setter Property="Foreground" Value="{Binding StatusColor}" />
12         Style>
13     Window.Resources>
14     Grid>
15         Grid.RowDefinitions>
16             RowDefinition Height="*">RowDefinition>
17             RowDefinition Height="30">RowDefinition>
18         Grid.RowDefinitions>
19         DataGrid ItemsSource="{Binding Collects}">
20             DataGrid.Columns>
21                 DataGridTextColumn Binding="{Binding Id}" Header="Id"/>
22             DataGrid.Columns>
23         DataGrid>
24         StackPanel Grid.Row="1" Orientation="Horizontal">
25             Button Content="获取数据" Command="{Binding GetData}"  HorizontalAlignment="Left" Height="30" Width="75"/>
26             Button Content="修改第一条" Command="{Binding ChangeFirst}"  HorizontalAlignment="Left" Height="30" Width="75"/>
27         StackPanel>
28     Grid>
29 Window>

viewmodel如下:

问题是这样的,如果TestModel内部默认的StatusColor不是null,第14行直接add就报错,如果是null,直接add就不报错,不清楚什么原因。那位大佬清楚解释下。

  1 public class MainViewModel : BaseNotifyEntity
  2     {
  3         private ObservableCollectionTestModel> collects = new ObservableCollectionTestModel>();
  4         public ObservableCollectionTestModel> Collects { get => collects; set => NotifyPropertyChanged(nameof(Collects), ref collects, value); }
  5 
  6         public DelegateCommand GetData => new DelegateCommand(async (o) =>
  7         {
  8             var data = await Datas();
  9             int i = 0;
 10             data.ForEach((item) =>
 11             {
 12                 //item.StatusColor如果为null那就可以直接add
 13                 //item.StatusColor不为null的时候这里为什么一定要重设颜色才不报错?,否则直接add就报错了
 14                 item.StatusColor = i % 2 == 0 ? new SolidColorBrush(Colors.Red) : new SolidColorBrush(Colors.Purple);
 15 
 16                 Collects.Add(item);
 17                 i++;
 18             });
 19         });
 20 
 21         public async TaskList>> Datas()
 22         {
 23             return await Task.Run(async () =>
 24             {
 25                 await Task.Delay(0);
 26                 ListTestModel> test = new ListTestModel>();
 27                 Parallel.For(0, 10, (i) =>
 28                 {
 29                     TestModel t = new TestModel()
 30                     {
 31                         Id = i,
 32                     };
 33                     test.Add(t);
 34                 });
 35                 return test;
 36             });
 37         }
 38         public DelegateCommand ChangeFirst => new DelegateCommand((o) =>
 39         {
 40             if (Collects.Count > 0)
 41             {
 42                 Collects[0].StatusColor = new SolidColorBrush(Colors.Pink);
 43             }
 44         });
 45     }
 46     public class TestModel : BaseNotifyEntity//, ICloneable
 47     {
 48         public TestModel()
 49         {
 50             this.StatusColor = new SolidColorBrush(Colors.Red);
 51         }
 52         private int id;
 53         public int Id { get => id; set => NotifyPropertyChanged(nameof(Id), ref id, value); }
 54 
 55         private Brush statusColor;
 56         public Brush StatusColor { get => statusColor; set => NotifyPropertyChanged(nameof(StatusColor), ref statusColor, value); }
 57 
 58         //public object Clone()
 59         //{
 60         //    object obj = null;
 61 
 62         //    obj = new TestModel()
 63         //    {
 64         //        Id = this.Id,
 65         //        StatusColor = this.StatusColor
 66         //    };
 67         //    return obj;
 68         //}
 69     }
 70     public class BaseNotifyEntity : INotifyPropertyChanged
 71     {
 72         public event PropertyChangedEventHandler PropertyChanged;
 73         public void NotifyPropertyChanged(string propertyName)
 74         {
 75             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 76         }
 77         protected void NotifyPropertyChangedT>(string propertyName, ref T field, T newValue = default)
 78         {
 79             field = newValue;
 80             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 81         }
 82     }
 83     /// summary>
 84     /// 实现DelegateCommand
 85     /// summary>
 86     public class DelegateCommand : ICommand
 87     {
 88         /// summary>
 89         /// 命令所需执行的事件
 90         /// summary>
 91         public Actionobject> ExecuteCommand { get; set; }
 92 
 93         public DelegateCommand()
 94         {
 95         }
 96         public DelegateCommand(Actionobject> execute)
 97         {
 98             ExecuteCommand = execute;
 99         }
100 
101         /// summary>
102         /// 命令可用性获取
103         /// summary>
104         /// param name="parameter">param>
105         /// returns>returns>
106         public bool CanExecute(object parameter)
107         {
108             return true;
109         }
110 
111         public event EventHandler CanExecuteChanged
112         {
113             add { CommandManager.RequerySuggested += value; }
114             remove { CommandManager.RequerySuggested -= value; }
115         }
116 
117         /// summary>
118         /// 命令具体执行
119         /// summary>
120         /// param name="parameter">param>
121         public void Execute(object parameter)
122         {
123             ExecuteCommand(parameter);
124         }
125     }

 

源码下载:下载

 

WPF的DataGrid下DataGridCell绑定Brush报错的问题

标签:null   ora   pen   horizon   mat   text   main   count   targe   

原文地址:https://www.cnblogs.com/zhengbinlong/p/13575572.html


评论


亲,登录后才可以留言!