x: привязать DataTemplate в DataGridTemplateColumn.CellTemplate не отображает содержимое - PullRequest
0 голосов
/ 31 марта 2020

После ответа на эту проблему windows -toolkit я использую x: Bind для привязки элементов ObservableCollection AlertEntry к ячейкам DataGridColumn. Мой XAML выглядит следующим образом:

    <controls:DataGrid ItemsSource="{x:Bind ViewModel.Alerts, Mode=OneWay}" AutoGenerateColumns="True" IsReadOnly="True">
        <controls:DataGrid.Columns>
            <controls:DataGridTemplateColumn Header="Time" >
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate x:DataType="ace:AlertEntry">
                        <TextBlock Text="{x:Bind Timestamp, Converter={StaticResource StringFormatConverter}, ConverterParameter='{}{H:mm:ss}'}"/>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
        </controls:DataGrid.Columns>
    </controls:DataGrid>

И мой класс AlertEntry:

public class AlertEntry
{
    public DateTime Timestamp;
    public ACEEnums.AlertLevel Level;
    public ACEEnums.AlertType Type;
    public string Info;
    public AlertEntry(ACEEnums.AlertLevel level, ACEEnums.AlertType type, string info = "")
    {
        Timestamp = DateTime.Now;
        Level = level;
        Type = type;
        Info = info;
    }
}

Когда элементы добавляются в ViewModel.Alerts, я вижу, что выделенные строки добавляются в DataGrid, но они не отображать контент. Когда я удаляю привязку и добавляю фиксированное текстовое значение, оно отображается правильно при каждом добавлении строки.

Элементы AlertEntry в ViewModel.Alerts правильно содержат данные.

У меня есть подтвердил, что StringFormatConverter работает в других привязках. На самом деле StringFormatConverter никогда не вызывается.

Я использую MVVM-Light и UWP.

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

При тестировании проблема может возникнуть в вашем StringFormatConverter, TextBlock свойстве Text, допускающем только строковое значение, поэтому нам нужно возвращать значение строкового типа в методе Convert.

public object Convert(object value, Type targetType, object parameter, string language)
{
    if (value == null)
        return null;

    if (parameter == null)
        return value;

    var dt = (DateTime)value;
    return dt.ToString((string)parameter);
}

And x: Bind support bind function , вы можете попробовать использовать Text="{x:Bind Timestamp.ToString()}" для проверки выше.

0 голосов
/ 01 апреля 2020

Моя DataGrid является элементом StackPanel, и я объявил свои конвертеры как stati c ресурсы StackPanel следующим образом:

<StackPanel.Resources>
    <helper:StringFormatConverter x:Key="StringFormatConverter" />
    <helper:AlertToString x:Key="AlertToString" />
</StackPanel.Resources>

Вместо этого я перевел конвертеры в ресурсы всей страницы. и в этот момент они начали работать.

<Page.Resources>
    <helper:StringFormatConverter x:Key="StringFormatConverter" />
    <helper:AlertToString x:Key="AlertToString" />
</Page.Resources>
...