Я пытаюсь создать простую сетку данных в WinUI 3, которая использует пользовательские DataTemplate
, которые различаются для второго столбца, создавая различное форматирование для ячеек второго столбца в зависимости от типа данных ячейки. Логическое значение будет иметь CheckBox
, а строка — TextBox
.
Для этого я расширяю класс DataTemplateSelector
на этой странице: https://learn.microsoft.com/en-us/windows/apps/design/controls/data-template-selector
Проблема в том, что метод переопределения DataTemplateSelectorExt.SelectTemplateCore()
моего расширения, показанный ниже, даже не запускается, поэтому я даже не могу проверить, хорош ли код шаблона. Ошибок нет, но во втором столбце таблицы данных показано только пространство имен класса CustomInfo
: ...ViewModels.CustomInfo
.
Мой первый вопрос: что мешает SelectTemplateCore()
запустить и предоставить второму столбцу пользовательские DataTemplate
?
XAML
<Page.Resources>
<local:DataTemplateSelectorExt
x:Key = "templateselctor"
CheckBoxTemplate = "{StaticResource CheckBoxTemplateResource}"
TextBlockTemplate = "{StaticResource TextBlockTemplateResource}"
TextBoxTemplate = "{StaticResource TextBoxTemplateResource}" />
<DataTemplate x:Key = "TextBlockTemplateResource" x:DataType = "x:String">
<Grid>
<TextBlock HorizontalAlignment = "Center" VerticalAlignment = "Center" />
</Grid>
</DataTemplate>
<DataTemplate x:Key = "TextBoxTemplateResource" x:DataType = "x:String">
<Grid>
<TextBox Text = "{x:Bind}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key = "CheckBoxTemplateResource" x:DataType = "x:Boolean">
<Grid>
<CheckBox HorizontalAlignment = "Center" VerticalAlignment = "Center" IsChecked = "{x:Bind}" />
</Grid>
</DataTemplate>
</Page.Resources>
<Grid>
<DataGrid
x:Name = "dataGrid1"
ItemsSource = "{x:Bind ViewModel.CustomInfoItems}" >
<DataGrid.Columns>
<GridTextColumn
MappingName = "CFieldDisplayName" />
<GridTemplateColumn
CellTemplateSelector = "{StaticResource templateselctor}"
MappingName = "CFieldValue" />
</DataGrid.Columns>
</DataGrid>
</Grid>
Код позади
public sealed partial class MyPage : Page
{
public DataGridViewModel ViewModel { get; }
public MyPage()
{
this.InitializeComponent();
ViewModel = new DataGridViewModel();
}
}
public class DataTemplateSelectorExt : DataTemplateSelector
{
public DataTemplate TextBlockTemplate { get; set; }
public DataTemplate TextBoxTemplate { get; set; }
public DataTemplate CheckBoxTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{ //This line is never his with a breakpoint
if (item == null)
{
return TextBlockTemplate;
}
else if (item.GetType() == typeof(string))
{
return TextBoxTemplate;
}
else if (item.GetType() == typeof(bool))
{
return CheckBoxTemplate;
}
else
{
return TextBoxTemplate;
}
}
}
ViewModel
public DataGridViewModel()
{
CustomInfoItems = new ObservableCollection<CustomInfo>();
this.GenerateCutomInfoItems();
}
private void GenerateCutomInfoItems()
{
CustomInfoItems.Add(new CustomInfo() { CFieldDisplayName = "Custom TextBox Item", CFieldValue = "String Value" });
CustomInfoItems.Add(new CustomInfo() { CFieldDisplayName = "Custom CheckBox Item", CFieldValue = true });
}
public class CustomInfo
{
public string CFieldDisplayName { get; set; }
public object CFieldValue { get; set; }
}
Как вы можете видеть в документе , DataTemplateSelector, DataTemplateSelector
имеет два переопределяемых метода.
В вашем случае попробуйте вместо этого переопределить второй.
Еще раз спасибо @AndrewKeepCoding. Событие срабатывает, но теперь моя проблема в том, что Object item
в SelectTemplateCore
не читается как строковый тип и логический тип в соответствии с методом GenerateCustomFieldItems
CFieldValue
. Должен ли я создать для этого новый вопрос?
Да. Лучше по 1 вопросу в посте.
Это связано с сеткой данных. Я предлагаю вам опубликовать проблему на GitHub для получения более подробной информации.