Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将Datagrid的标头绑定到viewmodel中的值?_C#_Wpf_Xaml_Mvvm_Datagrid - Fatal编程技术网

C# 如何将Datagrid的标头绑定到viewmodel中的值?

C# 如何将Datagrid的标头绑定到viewmodel中的值?,c#,wpf,xaml,mvvm,datagrid,C#,Wpf,Xaml,Mvvm,Datagrid,我正在尝试将viewmodel中的字符串绑定到DataGrid的标头。下面是我的.xaml代码: <DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False"> <DataGrid.Columns>

我正在尝试将viewmodel中的字符串绑定到DataGrid的标头。下面是我的.xaml代码:

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="{Binding InputNameHeader}" Binding="{Binding Name}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}"/>
            <DataGridTextColumn Header="{Binding InputStateHeader}" Binding="{Binding State}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleL}"/>
        </DataGrid.Columns>
    </DataGrid>

我遇到的问题是列标题总是空的。我假设这是因为我定义了ItemSource,而我绑定头的东西不是ItemSource的一部分


在这种情况下,有人对如何使用viewmodel中的字符串定义标题有什么建议吗?

您应该能够将
HeaderText
属性绑定到视图模型中的属性。只有绑定到数据源的列中显示的值


只要在视图模型中定义了
InputNameHeader
InputStateHeader
,就已经实现了
INotifyPropertyChanged
,并且已经将视图的
DataContext
设置为它应该使用的视图模型(著名的最后一句话)只需工作。

您可能没有在viewmodel中将
InputNameHeader
InputStateHeader
定义为属性。如果它们不是属性,则无法将其绑定到,并且您将不会得到任何值(以及绑定错误)

在我的viewmodel中,我可以使用以下方法快速测试您的设置:(请记住,我将其放入了我正在开发的程序中,因此它使用的是
BindableBase
SetProperty
from的通知方法。根据需要调整您的程序,并表示歉意。)

公共类TestClass:BindableBase
{
私有字符串名称;
公共字符串名
{
获取{返回this.name;}
set{SetProperty(ref this.name,value);}
}
私有字符串状态;
公共字符串状态
{
获取{返回this.state;}
set{SetProperty(ref this.state,value);}
}
}
公共类YourClass:BindableBase
{
公共ObservableCollection InputDataCollection{get;set;}
公共字符串InputNameHeader{get;set;}
公共字符串InputStateHeader{get;set;}
公共课
{
//测试数据
InputDataCollection=新的ObservableCollection()
{
新建TestClass(){Name=“Name1”,State=“State1”},
新建TestClass(){Name=“Name2”,State=“State2”}
};
InputNameHeader=“Name”;
InputStateHeader=“状态”;
}
}

当绑定到不在itemsource中的属性时,您需要将视图模型指定为

xmlns:viewModels="clr-namespace:My.App.ViewModels.Test"

<UserControl.Resources>
    <viewModels:YourClass x:Key="myViewModel"/>
</UserControl.Resources>

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="{Binding InputNameHeader, Source={StaticResource myViewModel}}" Binding="{Binding Name}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}"/>
            <DataGridTextColumn Header="{Binding InputStateHeader, Source={StaticResource myViewModel}}" Binding="{Binding State}" Width="50*"
                                ElementStyle="{StaticResource CellTextStyleL}"/>
        </DataGrid.Columns>
</DataGrid>
xmlns:viewModels=“clr命名空间:My.App.viewModels.Test”
找到了答案

我必须将标题绑定移动到DataGridTextColumn.HeaderTemplate并使用RelativeSource。现在它正常工作了

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Width="50*" ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputNameHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Input State" Binding="{Binding State}" Width="50*" ElementStyle="{StaticResource CellTextStyleL}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputStateHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>


您的Datacontext正确吗?如果有绑定错误,您会遇到哪些绑定错误?如何在viewmodel中定义InputNameHeader和InputStateHeader?:)这或多或少就是我的viewmodel的样子。我正在设置InputNameHeader和InputStateHeader(它们拼写正确;再次进行三重检查)。你能想出另一个原因吗,字符串不能到达视图?不能随便。您能否将输出中出现的viewmodel和任何绑定错误添加到原始问题中?我的viewmodel类有一个需要字符串的构造函数,因此我认为这不起作用。。。有没有一种方法可以使用DataContext?您可以使用元素绑定。如果在UserControl上设置DataContext,则可以使用如下内容:
{Binding Path=DataContext.InputNameHeader,ElementName=UserControlName}
使用将其DataContext绑定到ViewModel的控件的名称
<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Width="50*" ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputNameHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Input State" Binding="{Binding State}" Width="50*" ElementStyle="{StaticResource CellTextStyleL}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding DataContext.InputStateHeader, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>