我试图在我的WPF应用程序中创建一个通用的DataGrid
,其中列的数量和每个列头的值是通过绑定到类属性ResultsHeader
(一个字符串数组)来定义的。
以下是我到目前为止所做的:
<DataGrid Grid.Row="1" HorizontalAlignment="Left" ItemsSource="{Binding Results}" Margin="10" IsReadOnly="True" AutoGenerateColumns="False"
Visibility="{Binding ShowResults, Converter={StaticResource BooleanToVisibilityConverter}}">
<DataGrid.Columns>
<DataGridTextColumn Width="auto" Binding="{Binding [0]}"
Header="{Binding ResultsHeader[0], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Visibility="{Binding ShowResultsColumns[0], Converter={StaticResource BooleanToVisibilityConverter},
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
<DataGridTextColumn Width="auto" Binding="{Binding [1]}"
Header="{Binding ResultsHeader[1], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Visibility="{Binding ShowResultsColumns[1], Converter={StaticResource BooleanToVisibilityConverter},
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
<DataGridTextColumn Width="auto" Binding="{Binding [2]}"
Header="{Binding ResultsHeader[2], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Visibility="{Binding ShowResultsColumns[2], Converter={StaticResource BooleanToVisibilityConverter},
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
<DataGridTextColumn Width="auto" Binding="{Binding [3]}"
Header="{Binding ResultsHeader[3], RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Visibility="{Binding ShowResultsColumns[3], Converter={StaticResource BooleanToVisibilityConverter},
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
</DataGrid.Columns>
</DataGrid>
字符串
其中Results
表示表格单元格的内容,ShowResults
是控制DataGrid
是否可见或折叠的布尔值,ShowResultsColumns
是控制每个列是否可见或折叠的布尔值数组。以下是ViewModel类中每个变量和属性的编码方式:
private static readonly int maxNumberOfColumnsInResults = 4;
private ObservableCollection<string[]> _results;
public ObservableCollection<string[]> Results
{
get { return _results; }
set {
_results = value;
OnPropertyChanged(nameof(Results));
OnPropertyChanged(nameof(ShowResults));
}
}
public bool ShowResults
{
get { return _results != null; }
}
private string[] _resultsHeader;
public string[] ResultsHeader
{
get { return _resultsHeader; }
set {
_resultsHeader = value;
OnPropertyChanged(nameof(ResultsHeader));
OnPropertyChanged(nameof(ShowResultsColumns));
}
}
public bool[] ShowResultsColumns
{
get
{
return _resultsHeader == null
? Enumerable.Repeat(false, maxNumberOfColumnsInResults).ToArray()
: Enumerable.Range(0, maxNumberOfColumnsInResults).Select(x => x < ResultsHeader.Length).ToArray();
}
}
型BooleanToVisibilityConverter
和OnPropertyChanged
似乎是基于它们在应用程序其他功能上的行为而正确实现的,我的变量被分配了正确的值。绑定在Results
和ShowResults
上工作得很好,但在ResultsHeader
和ShowResultsColumns
上没有(不管_resultsHeader
的值是多少,所有列都是可见的,标题为空)。我是否遗漏了什么?我是否应该改变我的方法?
先谢了。
1条答案
按热度按时间fjnneemd1#
我是不是漏掉了什么?
是的,
DataGridColumn
没有可以绑定的DataContext
。我应该改变我的方法吗?
您可以使用绑定代理来捕获
DataContext
,如here所述。