C# 如何将Datagrid的标头绑定到viewmodel中的值?
我正在尝试将viewmodel中的字符串绑定到DataGrid的标头。下面是我的.xaml代码: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>
<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>