我正在尝试将我的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有任何建议?
答案 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:
属性绑定到视图模型中的属性。它只是绑定到数据源的列中显示的值。
只要在您的视图模型中定义了HeaderText
和InputNameHeader
,您就已经实现了InputStateHeader
,并且您已将视图的INotifyPropertyChanged
设置为查看模型它应该(着名的最后一句话)才能正常工作。
答案 2 :(得分:0)
您可能未在viewmodel中将InputNameHeader
和InputStateHeader
定义为属性。如果它们不是属性,则它们不能被绑定,并且您将没有任何值(以及绑定错误。)
我能够在我的视图模型中使用以下内容快速测试您的设置:(请记住,我将其投入到我正在处理的程序中,因此它正在使用来自Prism通知方法的BindableBase
和SetProperty
。根据需要适应您的计划,并向我道歉。)
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>