-2

数据模型:

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 (以重用而不是重复逻辑)并尝试以下操作:

<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 这是简化版,其实标题模板和单元格模板都比较复杂,元素和逻辑也不同。

4

2 回答 2

1

根据您说它正在工作的代码,您使用了错误的属性路径。
只是因为模板被定义为资源,所以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>
于 2020-07-11T09:54:56.973 回答
1

MyCellTemplate 上不正确的绑定路径 ( Path=. )

<DataTemplate x:Key="MyCellTemplate">
    <TextBox Text="{Binding Path=., Converter={StaticResource MyConverter}}"/>
</DataTemplate>
于 2020-07-11T09:39:53.017 回答