معرفی
سلام، این مقاله نحوه ایجاد DataGridColumn در زمان اجرا با Styles و Triggers را نشان می دهد. معمولاً در زمان طراحی وقتی یک DataGrid ایجاد میکنیم، ستونهای مورد نیاز را نیز ایجاد میکنیم یا ویژگی ستون autogenareted DataGrid را روی true تنظیم میکنیم تا بهطور خودکار ستونها را براساس منبع آیتم محدود شده ایجاد کنیم. فرض کنید شما نیاز به ایجاد یک DataGrid دارید بدون اینکه بدانید چه تعداد ستون باید ایجاد کنید و نام ستون ها را با ارزش اتصال آنها و ویژگی های دیگر مانند رنگ پس زمینه سلول و غیره نمی دانید.
در مورد قبلی این مقاله به شما کمک خواهد کرد. این مقاله یک DatagridColumn در زمان اجرا ایجاد می کند که دارای ویژگی های دیگری مانند هدر، سبک سلول، Trigger و غیره است.
در این مقاله با نکات زیر آشنا می شویم:
- ایجاد ستون DataGrid در زمان اجرا و اختصاص دادن به DataGrid.
- اتصال نام ویژگی با ستون DataGrid برای نمایش مقدار خاصیت در سلول DataGrid
- اضافه کردن سبک سلول در DataGrid در زمان اجرا
- افزودن ماشه به DataGrid در زمان اجرا
راه افتادن
برای ایجاد DataGridColumn در زمان اجرا به فضاهای نام زیر نیاز دارید. این فضاهای نام به ایجاد کنترلها، اتصال (که برای اتصال یک ویژگی با سلول DataGrid لازم است )، Styles، Triggers و غیره کمک میکنند .
- System.Windows.Controls
- سیستم.ویندوز.داده
- سیستم.ویندوز
1. ایجاد DataGridColumn
2. قید مال
در زمان طراحی، ما در حال ایجاد DataGridColumn مانند DataGridTextColumn با استفاده از XAML مانند کد زیر هستیم.
- <DataGrid x:Name="dgvRates">
- <DataGrid.Columns >
- <DataGridTextColumn Binding="{Binding Path=xyz, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header=" XYZ " MinWidth="110">
- </DataGridTextColumn>
- </DataGrid>
- //creates object of datagridtextcolum class
- DataGridTextColumn dataGridTextColumn = new DataGridTextColumn();
- // sets header name
- dataGridTextColumn.Header = “XYZ”;
- //creates object of binding class , accepts name of property as parameter , whose value to be display
- Binding binding = new Binding(“PropertyName”);
- // sets binding mode
- binding.Mode = BindingMode.TwoWay;
- // sets how trigger to be fired.
- binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
- // assigned the object of binding class to object of datagridtextcolumn class;
- dataGridTextColumn.Binding = binding;
- // added created column into column list of datagrid (dgvRates);
- dgvRates.Columns.Add(dataGridTextColumn);
3. افزودن سبک سلول در DataGrid در زمان اجرا
در زمان طراحی، برای اعمال یک سبک به سلول دیتاگرید، به عنوان مثال رنگ های پیش زمینه و پس زمینه، کد XAML زیر را انجام می دهیم.
- <DataGridTextColumn.CellStyle>
- <Style TargetType="{x:Type DataGridCell}">
- <Setter Property="Background" Value="{Binding Brushes.Black}" />
- <Setter Property=" Foreground " Value="{Binding Brushes.White}" />
- </Style>
- </DataGridTextColumn.CellStyle>
اما اگر بخواهیم در زمان اجرا رنگها را با سلول DataGrid تنظیم کنیم، ویژگیهای پیشزمینه و پسزمینه را با ویژگی datacontext یا با پسزمینه کنترل یا ویژگی پیشزمینه مانند کد XAML زیر پیوند میدهیم:
- <DataGridTextColumn.CellStyle>
- <Style TargetType="{x:Type DataGridCell}">
- <Setter Property="Foreground" Value="{Binding Background, ElementName=txtFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
- <Setter Property="Background" Value="Binding Background, ElementName=txtBackground, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
- </Style>
- </DataGridTextColumn.CellStyle>
در کد بالا، پیش زمینه DataGrid از ویژگی پس زمینه TextBox با نام txtfont و پس زمینه از ویژگی پس زمینه TextBox txtBackground تنظیم شده است. حالت اتصال دو طرفه است زیرا وقتی پسزمینه تغییر میکند، هم کادر متنی پسزمینه سلول و هم پیشزمینه بهطور خودکار تغییر میکنند.
برای اضافه کردن سبک سلول در زمان اجرا مانند کد XAML قبلی، باید از کلاس style و setter که در فضای نام System.Windows قرار دارد استفاده کنید . این کلاس به شما کمک می کند تا پس زمینه، سبک فونت و افزودن ماشه و غیره را تنظیم کنید. یک سبک از فهرستی از تنظیم کننده ها تشکیل شده است. اگر این سبک را روی یک عنصر اعمال کنید، تمام خصوصیات را با مقادیر مشخص شده تنظیم می کند. این ایده کاملاً شبیه به Cascading Styles Sheets (CSS) است که ما در توسعه وب با آن آشنا هستیم. کد زیر همان چیزی را که در کد XAML قبلی مشخص شده است را انجام می دهد.
- Style style = new Style(); // creates object of style class
- style.TargetType = typeof(DataGridCell); sets target type as DataGrid cell
- Setter setterBackground = new Setter(); // create objects of setter class
- setterBackground.Property = DataGridCell.BackgroundProperty;
- setterBackground.Value = Brushes.Green;
- style.Setters.Add(setterBackground);
- dataGridTextColumn.CellStyle = style;
4. اضافه کردن ماشه به DataGrid در زمان اجرا
زمانی که میخواهیم وقتی چیزی در برنامه اتفاق میافتد، چیزی تغییر کند، به محرکها نیاز داریم. به عنوان مثال، ما می خواهیم رنگ پس زمینه یک سلول DataGrid زمانی که مقداری تغییر می کند که معیار خاصی را برآورده می کند، تغییر کند. در این مقاله نحوه افزودن تریگر داده به DataGridcell برای تغییر رنگ پس زمینه توضیح داده شده است.
در زمان طراحی، برای افزودن یک تریگر داده با یک DataGrid، کدی را در XAML مانند کد زیر انجام می دهیم:
- DataGridTextColumn.CellStyle>
- <Style TargetType="{x:Type DataGridCell}">
- <Style.Triggers>
- <DataTrigger Binding="{Binding, UpdateSourceTrigger=PropertyChanged}" Value="<=100">
- <Setter Property="Background" Value="{Binding Brushes.Red, UpdateSourceTrigger=PropertyChanged}" />
- </DataTrigger>
- <DataTrigger Binding="{Binding, UpdateSourceTrigger=PropertyChanged}" Value="<=200">
- <Setter Property="Background" Value="{Binding Brushes.Black, UpdateSourceTrigger=PropertyChanged}" />
- </DataTrigger>
- <DataTrigger Binding="{Binding, UpdateSourceTrigger=PropertyChanged}" Value=">200">
- <Setter Property="Background" Value="Binding Brushes.Green"/>
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </DataGridTextColumn.CellStyle>
در کد XAML قبلی، اگر مقدار سلول DataGrid بزرگتر یا مساوی 100 باشد، رنگ پس زمینه سلول خوانده می شود و اگر <= 200 باشد، سیاه یا > 200، سبز می شود. حالا با استفاده از کد سی شارپ همین کار را انجام می دهیم. ما به یک کلاس datatrigger از فضای نام System.Window.Data نیاز داریم. کد سی شارپ زیر را ببینید که این کار را به عنوان XAML انجام می دهد.
- Style style = new Style();
- style.TargetType = typeof(DataGridCell);
- DataTrigger DT = new DataTrigger();
- Binding DataTriggerBinding = new Binding( “bindingName1”);
- DataTriggerBinding.Mode = BindingMode.Default;
- DataTriggerBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
- DT.Binding = DataTriggerBinding;
- DT.Value = “<=100”;
- Setter DataTriggerSetter = new Setter();
- DataTriggerSetter.Property = DataGridCell.BackgroundProperty;
- DataTriggerSetter.Value = Brushes.Red;
- DT.Setters.Add(DataTriggerSetter);
- style.Triggers.Add(DT);
- DataTrigger DT1 = new DataTrigger();
- Binding DataTriggerBinding1 = new Binding(“bindingName2”);
- DataTriggerBinding1.Mode = BindingMode.Default;
- DataTriggerBinding1.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
- DT1.Binding = DataTriggerBinding;
- DT1.Value = “<=200”;
- Setter DataTriggerSetter1 = new Setter();
- DataTriggerSetter1.Property = DataGridCell.BackgroundProperty;
- DataTriggerSetter1.Value = Brushes.Black;
- DT1.Setters.Add(DataTriggerSetter1);
- style.Triggers.Add(DT1);
- DataTrigger DT2 = new DataTrigger();
- Binding DataTriggerBinding2 = new Binding(“bindingName3”);
- DataTriggerBinding2.Mode = BindingMode.Default;
- DataTriggerBinding2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
- DT2.Binding = DataTriggerBinding2;
- DT2.Value = “<=100”;
- Setter DataTriggerSetter2 = new Setter();
- DataTriggerSetter2.Property = DataGridCell.BackgroundProperty;
- DataTriggerSetter2.Value = Brushes.Red;
- DT2.Setters.Add(DataTriggerSetter2);
- style.Triggers.Add(DT2);
- dataGridTextColumn.CellStyle = style;
کد کامل
-
//creates object of datagridtextcolum classDataGridTextColumn dataGridTextColumn = new DataGridTextColumn();// sets header namedataGridTextColumn.Header = "Dynamic Column";//creates object of binding class , accepts name of property as parameter , whose value to be displayBinding binding = new Binding("PropertyName");// sets binding modebinding.Mode = BindingMode.TwoWay;// sets how trigger to be fired.binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;// assigned the object of binding class to object of datagridtextcolumn class;dataGridTextColumn.Binding = binding;//code for add style to rowStyle Rowstyle = new Style(); // creates object of style classRowstyle.TargetType = typeof(DataGridRow);//sets target type as DataGrid rowSetter setterBackground = new Setter(); // create objects of setter classsetterBackground.Property = DataGridRow.BackgroundProperty;setterBackground.Value = Brushes.Black;Rowstyle.Setters.Add(setterBackground);Setter setterForeGround = new Setter();setterForeGround.Property = DataGridRow.ForegroundProperty;setterForeGround.Value = Brushes.White;Rowstyle.Setters.Add(setterForeGround);dgvRate.RowStyle = Rowstyle;Style DataGridCellStyle = new Style();DataGridCellStyle.TargetType = typeof(DataGridCell);DataTrigger DT = new DataTrigger();Binding DataTriggerBinding = new Binding("bindingName");DataTriggerBinding.Mode = BindingMode.Default;DataTriggerBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;DT.Binding = DataTriggerBinding;DT.Value = "<=100";Setter DataTriggerSetter = new Setter();DataTriggerSetter.Property = DataGridCell.BackgroundProperty;DataTriggerSetter.Value = Brushes.Red;DT.Setters.Add(DataTriggerSetter);DataGridCellStyle.Triggers.Add(DT);DataTrigger DT1 = new DataTrigger();Binding DataTriggerBinding1 = new Binding("bindingName");DataTriggerBinding1.Mode = BindingMode.Default;DataTriggerBinding1.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;DT1.Binding = DataTriggerBinding;DT1.Value = "<=200";Setter DataTriggerSetter1 = new Setter();DataTriggerSetter1.Property = DataGridCell.BackgroundProperty;DataTriggerSetter1.Value = Brushes.Black;DT1.Setters.Add(DataTriggerSetter1);DataGridCellStyle.Triggers.Add(DT1);DataTrigger DT2 = new DataTrigger();Binding DataTriggerBinding2 = new Binding("bindingName");DataTriggerBinding2.Mode = BindingMode.Default;DataTriggerBinding2.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;DT2.Binding = DataTriggerBinding2;DT2.Value = ">=200";Setter DataTriggerSetter2 = new Setter();DataTriggerSetter2.Property = DataGridCell.BackgroundProperty;DataTriggerSetter2.Value = Brushes.Red;DT2.Setters.Add(DataTriggerSetter2);DataGridCellStyle.Triggers.Add(DT2);dataGridTextColumn.CellStyle = DataGridCellStyle;// added created column into column list of datagrid (dgvRates);dgvRate.Columns.Add(dataGridTextColumn);
-