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

时间:2016-02-16 20:44:15

标签: 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>
            <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中的字符串定义Headers有任何建议?

4 个答案:

答案 0 :(得分:6)

想出来。

我必须将Header绑定移动到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>

答案 1 :(得分:0)

您应该能够将curl https://api.stripe.com/v1/events/evt_123 \ -u sk_test_somekey: 属性绑定到视图模型中的属性。它只是绑定到数据源的列中显示的值。

只要在您的视图模型中定义了HeaderTextInputNameHeader,您就已经实现了InputStateHeader,并且您已将视图的INotifyPropertyChanged设置为查看模型它应该(着名的最后一句话)才能正常工作。

答案 2 :(得分:0)

您可能未在viewmodel中将InputNameHeaderInputStateHeader定义为属性。如果它们不是属性,则它们不能被绑定,并且您将没有任何值(以及绑定错误。)

我能够在我的视图模型中使用以下内容快速测试您的设置:(请记住,我将其投入到我正在处理的程序中,因此它正在使用来自Prism通知方法的BindableBaseSetProperty。根据需要适应您的计划,并向我道歉。)

public class TestClass : BindableBase
{
  private string name;
  public string Name
  {
    get { return this.name; }
    set { SetProperty(ref this.name, value); }
  }

  private string state;
  public string State
  {
    get { return this.state; }
    set { SetProperty(ref this.state, value); }
  }
}

public class YourClass : BindableBase  
{
  public ObservableCollection<TestClass> InputDataCollection { get; set; }
  public string InputNameHeader { get; set;}
  public string InputStateHeader { get; set; }

  public YourClass()
  {
    // Test Data
    InputDataCollection = new ObservableCollection<TestClass>()
    {
      new TestClass() { Name = "Name1", State = "State1" },
      new TestClass() { Name = "Name2", State = "State2" }
    };
    InputNameHeader = "Name";
    InputStateHeader = "State";
  }
}

答案 3 :(得分:0)

绑定到不属于ItemsSource的属性时,您需要将 ViewModel 指定为来源

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>