Привязка WPF ListView CellTemplate - PullRequest
0 голосов
/ 11 июля 2020

Модель данных:

public class Metric
{
    public string                         Name      { get; set; }
    public bool                           IsEnabled { get; set; }
}

public class FileItem
{
    public string                         FN        { get; set; }
    public ObservableCollection<string>   Values    { get; set; }
}

public class MainViewModel
{
    public ObservableCollection<Metric>   Metrics   { get; set; }
    public ObservableCollection<FileItem> FileItems { get; set; }
}

XAML:

<Window.Resources>
    <local:ValueConverter x:Key="ValueConverter" />
    <DataTemplate x:Key="MetricHeaderTemplate">
        <TextBlock Text="{Binding Name}" />
    </DataTemplate>
</Window.Resources>
...
<ListView ItemsSource="{Binding FileItems}">
    <ListView.View>
        <GridViewColumn Header="Path to file" Width="400">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding FN}" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn HeaderTemplate="{StaticResource MetricHeaderTemplate}" Header="{Binding Metrics[0]}">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Values[0], Converter={StaticResource ValueConverter}}"/>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn HeaderTemplate="{StaticResource MetricHeaderTemplate}" Header="{Binding Metrics[1]}">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Values[1], Converter={StaticResource ValueConverter}}"/>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </ListView.View>
</ListView>

Все работает должным образом. Я хотел бы переместить CellTemplate в StaticResources (чтобы повторно использовать, а не дублировать logi c) и попробовать следующее:

<Window.Resources>
    <local:ValueConverter x:Key="ValueConverter" />
    <DataTemplate x:Key="MetricHeaderTemplate">
        <TextBlock Text="{Binding Name}" />
    </DataTemplate>
    <DataTemplate x:Key="MetricCellTemplate">
        <TextBox Text="{Binding Path=., Converter={StaticResource ValueConverter}}"/>
    </DataTemplate>
</Window.Resources>
...
<ListView ItemsSource="{Binding FileItems}">
    <ListView.View>
        <GridViewColumn Header="Path to file" Width="400">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding FN}" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn
            HeaderTemplate="{StaticResource MetricHeaderTemplate}"
            Header="{Binding Metrics[0]}"
            CellTemplate="{StaticResource MetricCellTemplate}"
            DisplayMemberBinding="{Binding Values[0]}"
        />
        <GridViewColumn
            HeaderTemplate="{StaticResource MetricHeaderTemplate}"
            Header="{Binding Metrics[1]}"
            CellTemplate="{StaticResource MetricCellTemplate}"
            DisplayMemberBinding="{Binding Values[1]}"
        />
    </ListView.View>
</ListView>

К сожалению, не повезло: значение ячейки не отображается. Что мне не хватает?

Спасибо.

PS Это упрощенная версия, на самом деле и шаблон заголовка, и шаблон ячейки более сложны и имеют разные элементы и logi c.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Согласно коду, который вы сказали, что он работает, вы используете неправильный путь свойства. Поскольку шаблон определен как ресурс, Binding.Path не изменяется. Это связано с тем, что установленная привязка относится к DataContext из DataTemplate. После применения внешнего шаблона DataContext остается прежним. Таким образом, Binding.Path остается прежним:

<Window.Resources>
  <local:MyConverter x:Key="MyConverter" />
  <DataTemplate x:Key="MyCellTemplate">
    <TextBox Text="{Binding Path=Values[0], Converter={StaticResource MyConverter}}"/>
  </DataTemplate>
</Window.Resources>
1 голос
/ 11 июля 2020

Неправильный путь привязки ( Path =. ) в MyCellTemplate

<DataTemplate x:Key="MyCellTemplate">
    <TextBox Text="{Binding Path=., Converter={StaticResource MyConverter}}"/>
</DataTemplate>
...