powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
25 сообщений из 38, страница 1 из 2
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697582
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу использовать для всех столбцов DataGrid-а CellTemplateSelector, чтобы отображать содержимое ячеек несколькими типовыми способами. Столбцы создаются программно, из набор заранее неизвестен.

Проблема в том, что набор шаблонов ячеек универсальный и от столбца не зависит. Но у шаблона ячейки контекст-то - это строка, а не ячейка. То есть универсальный шаблон не знает, какое именно поле нужно дернуть из текущего контекста строки, чтобы отобразить его в качестве ячейки.

Конечно, можно создавать отдельный селектор для каждого столбца, тогда селектор будет знать, какие данные нужно отобразить из контекста строки. Но как сообщить эту информацию выбранному шаблону?
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697655
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увидел DataGridBoundColumn
Пытаюсь разобраться в принципе его работы
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697698
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно унаследоваться от DataGridTemplateColumn, в унаследованный класс перетащить определение Binding из DataGridBoundColumn, и переопределить 2 метода как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
  var baseElement = base.GenerateElement(cell, dataItem);
  if (Binding != null && baseElement!=null)
    BindingOperations.SetBinding(baseElement, FrameworkElement.TagProperty, Binding);
  return baseElement;
}

protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
  var baseElement = base.GenerateEditingElement(cell, dataItem);
  if (Binding != null && baseElement!=null)
    BindingOperations.SetBinding(baseElement, FrameworkElement.TagProperty, Binding);
  return baseElement;
}


тогда разметка самого грида будет выглядеть так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<DataGrid
  IsReadOnly="True"
  AutoGenerateColumns="False"
  ItemsSource="{Binding Items}">
  <DataGrid.Columns>
    <local:DataGridTemplateBoundColumn
      Header="Name"
      Binding="{Binding Name}"
      CellTemplateSelector="{StaticResource GridCellTemplateSelector}" />
  </DataGrid.Columns>
</DataGrid>


и DataTemplate вот так:
Код: xml
1.
2.
3.
4.
<DataTemplate x:Key="CellTemplate">
  <TextBlock
    Text="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ContentPresenter}}}" />
</DataTemplate>


- DataGridTemplateColumn в качестве результата отработки GenerateElement/GenerateEditingElement всегда возвращает ContentPresenter, у которого ContentTemplate - как раз DataTemplate ячейки.
Разумеется, в рабочем коде использование TagProperty лучше заменить на attached property для ContentPresenter'а. А в тестовом проекте у меня все вполне заработало и так.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697763
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно создать ской тип колонки и наследовать его от класса DataGridBoundColumn, это позволит использовать как биндинг, остается только переопределить методы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
	return LoadTemplateContent(dataItem, cell);
}

protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
{
	return LoadTemplateContent(dataItem, cell);
}


Готово :D В методе LoadTemplateContent необходимо будет настроить все Binding'и
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697781
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesГотово :D В методе LoadTemplateContent необходимо будет настроить все Binding'иВот это я и не догоняю как сделать. Генерить контент с помощью кода не хочу - хочу шаблон из ресурса. И вот этому шаблону нужно каким-то образом установить нужный датаконтекст
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697782
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не понимаю, в какой момент этот метод вызывается. Я думал, что в dataItem я обнаружу свой row, однако фиг
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697792
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

На базе твоей идеи замутил так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
		public class GridColumn : DataGridTemplateColumn
		{
			private readonly int _colIndex;

			public GridColumn(int colIndex)
			{
				_colIndex = colIndex;
			}

			protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
			{
				var binding = new Binding($"Cells[{_colIndex}]");
				BindingOperations.SetBinding(cell, DataContextProperty, binding);
				return base.GenerateElement(cell, dataItem);
			}


вроде заработало, ща буду развивать
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697796
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя еще вопрос, как это будет вести себя с виртуализацией строк...
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39697977
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRoman MejtesГотово :D В методе LoadTemplateContent необходимо будет настроить все Binding'иВот это я и не догоняю как сделать. Генерить контент с помощью кода не хочу - хочу шаблон из ресурса. И вот этому шаблону нужно каким-то образом установить нужный датаконтекст
Датаконтекст контента у ContentPresenter'а - это, как ни странно, сам контент ( см. ). Поэтому нужно просто забиндить контент:
Код: c#
1.
2.
3.
4.
5.
6.
7.
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
  var baseElement = (ContentPresenter)base.GenerateElement(cell, dataItem);
  if (Binding == null || baseElement == null) return baseElement;
  BindingOperations.SetBinding(baseElement, ContentPresenter.ContentProperty, Binding);
  return baseElement;
}


Тогда в шаблоне можно сразу писать
Код: xml
1.
2.
3.
<DataTemplate x:Key="CellTemplate">
  <TextBlock Text="{Binding}" />
</DataTemplate>


В тестовом примере это работает вполне нормально. И вполне откликается на изменения забинденного на колонку свойства модели.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698040
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Ну тут понятно, вариантов несколько. Я просто не разобрался с вариантом Романа, а понять его тоже хочется.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698111
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProСон Веры Павловны,

Ну тут понятно, вариантов несколько. Я просто не разобрался с вариантом Романа, а понять его тоже хочется.


Вот рабочий пример, как я понимаю, того, что вам надо:


Example
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
<Window x:Class="WpfApp5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApp5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:ProcentConverter x:Key="ProcentConverter"/>

        <DataTemplate DataType="{x:Type sys:Int32}" x:Key="NumberTemplate">
            <Grid MinWidth="50" MinHeight="20" >
                <TextBlock Text="{Binding}" Margin="2"
                           HorizontalAlignment="Right" VerticalAlignment="Center"/>
            </Grid>
        </DataTemplate>

        <DataTemplate DataType="{x:Type sys:Int32}" x:Key="ChartTemplate">
            <Grid MinWidth="50" MinHeight="20" >
                <Border Background="LightGreen" RenderTransformOrigin="0,0">
                    <Border.RenderTransform>
                        <ScaleTransform CenterX="0" ScaleX="{Binding Converter={StaticResource ProcentConverter}}"/>
                    </Border.RenderTransform>
                </Border>
                <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Grid>
        </DataTemplate>

    </Window.Resources>
    <Window.ContentTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>


                <StackPanel Grid.Row="0" Orientation="Horizontal">
                    <RadioButton Content="Number" Name="PART_Number" IsChecked="True"/>
                    <RadioButton Content="ProgressBar" />
                </StackPanel>

                <DataGrid Grid.Row="1" x:Name="PART_DataGrid">
                    <DataGrid.Columns>
                        <local:TemplateGridColumn Binding="{Binding Cells[0]}" />
                        <local:TemplateGridColumn Binding="{Binding Cells[1]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[2]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[3]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[4]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[5]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[6]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[7]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[8]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[9]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[10]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[11]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[12]}"/>
                        <local:TemplateGridColumn Binding="{Binding Cells[13]}"/>
                    </DataGrid.Columns>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                    <local:RowViewModel/>
                </DataGrid>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="PART_Number" Property="IsChecked" Value="True">
                    <Setter TargetName="PART_DataGrid" Property="ItemTemplate" Value="{StaticResource NumberTemplate}"/>
                </Trigger>
                <Trigger SourceName="PART_Number" Property="IsChecked" Value="False">
                    <Setter TargetName="PART_DataGrid" Property="ItemTemplate" Value="{StaticResource ChartTemplate}"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </Window.ContentTemplate>
</Window>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
using System;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApp5
{
    public class ProcentConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return 0;
            return (double)value / 100.0;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (double)value * 100.0;
        }
    }

    public class RowViewModel
    {
        private static readonly Random _rnd = new Random();
        public RowViewModel()
        {
            Cells = Enumerable.Range(0, 100).Select(p => (double)_rnd.Next(0, 100)).ToArray();
        }

        public double[] Cells { get; }
    }


    public class TemplateGridColumn : DataGridBoundColumn
    {
        public DataGrid DataGrid => DataGridOwner;

        public DataTemplateSelector TemplateSelector
        {
            get { return (DataTemplateSelector)GetValue(TemplateSelectorProperty); }
            set { SetValue(TemplateSelectorProperty, value); }
        }
        public static readonly DependencyProperty TemplateSelectorProperty =
            DependencyProperty.Register("TemplateSelector", typeof(DataTemplateSelector), typeof(TemplateGridColumn), new PropertyMetadata(null));


        public DataTemplate Template
        {
            get { return (DataTemplate)GetValue(TemplateProperty); }
            set { SetValue(TemplateProperty, value); }
        }
        public static readonly DependencyProperty TemplateProperty =
            DependencyProperty.Register("Template", typeof(DataTemplate), typeof(TemplateGridColumn), new PropertyMetadata(null));



        public static DataTemplate GetCellTemplate(DependencyObject obj)
        {
            return (DataTemplate)obj.GetValue(CellTemplateProperty);
        }

        public static void SetCellTemplate(DependencyObject obj, DataTemplate value)
        {
            obj.SetValue(CellTemplateProperty, value);
        }

        // Using a DependencyProperty as the backing store for CellTemplate.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CellTemplateProperty =
            DependencyProperty.RegisterAttached("CellTemplate", typeof(DataTemplate), typeof(TemplateGridColumn), new PropertyMetadata(null));



        protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
        {
            var presenter = new ContentPresenter()
            {
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment = VerticalAlignment.Stretch
            };

            BindingOperations.SetBinding(presenter, ContentPresenter.ContentProperty, Binding);
            presenter.SetBinding(ContentPresenter.ContentTemplateProperty, new Binding(nameof(DataGrid.ItemTemplate)) { Source = DataGridOwner });
            //presenter.SetBinding(ContentPresenter.ContentTemplateSelectorProperty, new Binding(nameof(TemplateSelector)) { Source = this });
            
            return presenter;
        }

        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            var presenter = new ContentPresenter();
            BindingOperations.SetBinding(presenter, ContentPresenter.ContentProperty, Binding);
            presenter.SetBinding(ContentPresenter.ContentTemplateProperty, new Binding(nameof(DataGrid.ItemTemplate)) { Source = DataGridOwner });
            //presenter.SetBinding(ContentPresenter.ContentTemplateSelectorProperty, new Binding(nameof(TemplateSelector)) { Source = this });
            return presenter;
        }
    }
}

...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698139
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного фиксов добавил, чтоб редактирование ячеек работало и лишний мусор почистил

Ninja Fixes
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
using System;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Threading;

namespace WpfApp5
{
    #region ViewModel
    public class MainModel
    {
        public ObservableCollection<RowViewModel> Rows { get; } 
            = new ObservableCollection<RowViewModel>(Enumerable.Range(0, 100).Select(p => new RowViewModel()));
    }

    public class RowViewModel
    {
        private static readonly Random _rnd = new Random();
        public RowViewModel()
        {
            Cells = Enumerable.Range(0, 100).Select(p => (double)_rnd.Next(0, 100)).ToArray();
        }

        public double[] Cells { get; }
    }
    #endregion

    #region Util classes
    public class ColumnGenerator
    {
        public static bool GetGenerateColumns(DependencyObject obj) { return (bool)obj.GetValue(GenerateColumnsProperty); }
        public static void SetGenerateColumns(DependencyObject obj, bool value) { obj.SetValue(GenerateColumnsProperty, value); }
        public static readonly DependencyProperty GenerateColumnsProperty =
            DependencyProperty.RegisterAttached("GenerateColumns", typeof(bool), typeof(ColumnGenerator), new PropertyMetadata(false, OnPropertyChanged));

        private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
            {
                var dataGrid = (DataGrid)d;
                GenerateColumns(dataGrid);
            }
        }

        private static void GenerateColumns(DataGrid dataGrid)
        {
            dataGrid.Columns.Clear();
            for (var i = 0; i < 100; i++)
            {
                var column = new TemplateGridColumn() { Binding = new Binding($"Cells[{i}]") { Mode = BindingMode.TwoWay }, };
                dataGrid.Columns.Add(column);
            }
        }
    }

    public class MultiplyConverter : IValueConverter
    {
        public double Multiply { set; get; }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return 0;
            return (double)value * Multiply;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return (double)value * Multiply;
        }
    }
    #endregion
    
    public class TemplateGridColumn : DataGridBoundColumn
    {
        protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
        {
            var textBox = new TextBox();
            BindingOperations.SetBinding(textBox, TextBox.TextProperty, Binding);
            Dispatcher.BeginInvoke(new DispatcherOperationCallback(arg =>
            {
                var txt = (TextBox)arg;
                txt.Focus();
                txt.Select(textBox.Text.Length, 0);
                return null;
            }), DispatcherPriority.Input, textBox);
            return textBox;
        }

        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
        {
            var presenter = new ContentPresenter();
            BindingOperations.SetBinding(presenter, ContentPresenter.ContentProperty, Binding);
            presenter.SetBinding(ContentPresenter.ContentTemplateProperty, new Binding(nameof(DataGrid.ItemTemplate)) { Source = DataGridOwner });
            return presenter;
        }
    }
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
<Window x:Class="WpfApp5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApp5"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Content>
        <local:MainModel/>
    </Window.Content>
    <Window.Resources>

        <local:MultiplyConverter x:Key="MultiplyConverter" Multiply="0.01"/>

        <DataTemplate DataType="{x:Type sys:Int32}" x:Key="NumberTemplate">
            <Grid MinWidth="50" MinHeight="20" >
                <TextBlock Text="{Binding}" Margin="2"
                           HorizontalAlignment="Right" VerticalAlignment="Center"/>
            </Grid>
        </DataTemplate>

        <DataTemplate DataType="{x:Type sys:Int32}" x:Key="ChartTemplate">
            <Grid MinWidth="50" MinHeight="20" >
                <Border Background="LightGreen" RenderTransformOrigin="0,0">
                    <Border.RenderTransform>
                        <ScaleTransform CenterX="0" ScaleX="{Binding Converter={StaticResource MultiplyConverter}}"/>
                    </Border.RenderTransform>
                </Border>
                <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Grid>
        </DataTemplate>

    </Window.Resources>
    <Window.ContentTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <StackPanel Grid.Row="0" Orientation="Horizontal">
                    <RadioButton Content="Number" Name="PART_Number" IsChecked="True" Margin="3"/>
                    <RadioButton Content="ProgressBar" Margin="3"/>
                </StackPanel>
                <DataGrid Grid.Row="1" x:Name="PART_DataGrid" 
                          ItemsSource="{Binding Rows}" 
                          AutoGenerateColumns="False"
                          local:ColumnGenerator.GenerateColumns="True"
                          SelectionMode="Single" SelectionUnit="Cell"
                          EnableColumnVirtualization="True"
                          EnableRowVirtualization="True">
                </DataGrid>
            </Grid>

            <DataTemplate.Triggers>
                <Trigger SourceName="PART_Number" Property="IsChecked" Value="True">
                    <Setter TargetName="PART_DataGrid" Property="ItemTemplate" Value="{StaticResource NumberTemplate}"/>
                </Trigger>
                <Trigger SourceName="PART_Number" Property="IsChecked" Value="False">
                    <Setter TargetName="PART_DataGrid" Property="ItemTemplate" Value="{StaticResource ChartTemplate}"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </Window.ContentTemplate>
</Window>

...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698141
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesProgressbarО, чёрт, я думал мне в голову пришла гениальная мысль

За пример спасибо, ща посмотрю
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698143
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо еще раз, усё ясно.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698305
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то в итоге не получается прикрутить ни одну из озвученных здесь идей.

Грубо говоря, набор строк представляет собой коллекцию классов Row

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Row
{
    public List<Cell> Cells { get; set; }
}
public class Cell
{
    public object Value { get; set; }
    public string Background { get; set; }
    public string TemplateName { get; set; }
}


Нужно отобразить Value (и/или другие поля) с помощью шаблона, который по имени TemplateName будет найден в ресурсах (вопрос кэширования поиска ресурсов пока не обсуждаем)

Пример Романа использует фиксированный шаблон на все ячейки, хоть и через байндинг
Пример Сна/мой работает до тех пор, пока не начинаешь прокручивать строки (с виртуализацией) - дальше байндинг слетает и вместо Cell контекстом становится Row. В общем, пока не справился с задачей.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698316
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, наврал, сорри. Работает вариант Сна с присвоением контента контентпрезентору, полученному через base.GenerateEditingElement
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698379
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй поменять тип виртуализации с  VirtualizingStackPanel.VirtualizationMode="Recycling" на  VirtualizingStackPanel.VirtualizationMode="Standard"
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698389
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesПопробуй поменять тип виртуализации с  VirtualizingStackPanel.VirtualizationMode="Recycling" на  VirtualizingStackPanel.VirtualizationMode="Standard"Ага. Для этого 21664070 наверное помогло бы, но я в итоге забайндил ContentPresenter.ContentProperty
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698400
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRoman MejtesПопробуй поменять тип виртуализации с  VirtualizingStackPanel.VirtualizationMode="Recycling" на  VirtualizingStackPanel.VirtualizationMode="Standard"Ага. Для этого 21664070 наверное помогло быда
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698404
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
А почему шаблон не на колонку, а на ячейку?
Задача такая?
Вроде колонки всегда единообразно выглядят.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698407
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вроде колонки всегда единообразно выглядят.Действительно. А CellTemplateSelector придумали дураки от нечего делать.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698410
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRoman MejtesПопробуй поменять тип виртуализации с  VirtualizingStackPanel.VirtualizationMode="Recycling" на  VirtualizingStackPanel.VirtualizationMode="Standard"Ага. Для этого 21664070 наверное помогло бы, но я в итоге забайндил ContentPresenter.ContentPropertyТакой вариант (установка DataContext на контейнер) был бы интересен с той точки зрения, что можно было бы использовать DataGrid.CellStyle для каких-то глобальных вещей, например установки бэкграунда ячейки. Но с ним творится какая-то дикая херня - в контексте стиля попеременно появляются Row и Cell
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698415
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Теперь понятно). ОК.
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698440
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если нужна динамическая возможность переключать вид ячеек, то TemplateSelector для данной задачи не подходит
Так как тип определяется по сути 1 раз и до момент создания нового объекта. Используйте просто шаблоны и переключайте их триггерами
...
Рейтинг: 0 / 0
DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
    #39698443
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShocker.Proпропущено...
Ага. Для этого 21664070 наверное помогло бы, но я в итоге забайндил ContentPresenter.ContentPropertyТакой вариант (установка DataContext на контейнер) был бы интересен с той точки зрения, что можно было бы использовать DataGrid.CellStyle для каких-то глобальных вещей, например установки бэкграунда ячейки. Но с ним творится какая-то дикая херня - в контексте стиля попеременно появляются Row и Cell
Этот вариант абсолютно бесполезен, там установленный датаконтекст держится чуть меньше, чем нисколько, потому что его потом переопределяет ItemsPresenter, внутри которого размещены эти DataGridCell.
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGridTemplateColumn.CellTemplateSelector - определение столбца в шаблоне
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]