XAML WPF数据网格,其中使用MVVM动态生成标题和列数

wh6knrhe  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(111)

我试图在我的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();
    }
}


BooleanToVisibilityConverterOnPropertyChanged似乎是基于它们在应用程序其他功能上的行为而正确实现的,我的变量被分配了正确的值。绑定在ResultsShowResults上工作得很好,但在ResultsHeaderShowResultsColumns上没有(不管_resultsHeader的值是多少,所有列都是可见的,标题为空)。我是否遗漏了什么?我是否应该改变我的方法?
先谢了。

fjnneemd

fjnneemd1#

我是不是漏掉了什么?
是的,DataGridColumn没有可以绑定的DataContext
我应该改变我的方法吗?
您可以使用绑定代理来捕获DataContext,如here所述。

相关问题