我正在尝试将我的一个列上的数据绑定到我页面的ViewModel中的数据(而不是网格绑定的对象)。
我建议的here以下内容无效。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding ElementName=LayoutRoot, Path=DataContext.JUNK}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
在我的ViewModel
中public string JUNK { get; set; }
在ViewModel的构造函数
中设置为"HELLO"
有谁看到我做错了什么?
修改
这是整个XAML。相关列一直在底部,在网格内的网格中
ALSO - 我无法将我的整个源码再次放到这里(不确定它是Citrix还是什么),但我采用了相同的精确绑定表达式在datagrid的按钮中工作,我将它放在除了网格之外的普通旧TextBlock的文本上,它就像一个魅力。我还在网格中添加了一个新的虚拟文本列,并为文本使用了相同的绑定表达式,它仍然不工作。看起来这个绑定表达式很好,但拒绝在网格附近的任何地方工作。
<UserControl x:Class="MainApp.WPF.ucFmvHistoryDisplayGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="1000" x:Name="LayoutRoot">
<UserControl.Resources>
<Style x:Name="rightAlignedColumn" x:Key="rightAlignedColumn" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right" />
</Style>
<Style x:Name="centerAlignedColumn" x:Key="centerAlignedColumn" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</UserControl.Resources>
<Grid>
<DataGrid x:Name="dbTop" ItemsSource="{Binding PropertyGroupSource}" HorizontalAlignment="Left" Background="White" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" AutoGenerateColumns="False" Grid.Row="1" Width="800">
<DataGrid.Columns>
<DataGridTextColumn Width="120" Header="Property Num" Binding="{Binding PropertyNum}"></DataGridTextColumn>
<DataGridTextColumn Width="120" Header="Alt Description" Binding="{Binding AltDescription}"></DataGridTextColumn>
<DataGridTextColumn Width="80" Header="County" Binding="{Binding County}"></DataGridTextColumn>
<DataGridTextColumn Width="100" Header="State" Binding="{Binding State}" ElementStyle="{StaticResource centerAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="85" Header="Phase" Binding="{Binding Phase}"></DataGridTextColumn>
<DataGridTextColumn Width="85" Header="FMV" Binding="{Binding FmvTotal}"></DataGridTextColumn>
<DataGridTextColumn Width="100" Header="Assessed Value" Binding="{Binding AssessedValueTotal}"></DataGridTextColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border Margin="5" BorderBrush="Black" BorderThickness="1">
<DataGrid Margin="5" Background="White" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" AutoGenerateColumns="False" Grid.Row="1" ItemsSource="{Binding PropertyFmvSource}">
<DataGrid.Columns>
<DataGridTextColumn Width="125" Header="County Acct Num" Binding="{Binding Property.CountyAccountNum, StringFormat=d}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="80" Header="City" Binding="{Binding Property.City, StringFormat=d}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="80" Header="Jurisdiction" Binding="{Binding Property.Jurisdiction, StringFormat=d}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="80" Header="FMV Date" Binding="{Binding MostRecentFMV.FMVDate, StringFormat=d}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="100" Header="FMV" Binding="{Binding MostRecentFMV.FMV, StringFormat=N0}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="85" Header="Assess Ratio" Binding="{Binding MostRecentFMV.AssessmentRatio, StringFormat=N3}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTextColumn Width="105" Header="Assessed Value" Binding="{Binding MostRecentFMV.AssessedValue, StringFormat=N0}" ElementStyle="{StaticResource rightAlignedColumn}"></DataGridTextColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding ElementName=LayoutRoot, Path=DataContext.JUNK}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Border>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
答案 0 :(得分:3)
使用RelativeSource绑定绑定到包含DataGrid的DataContext应该有效:
<Button Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid, AncestorLevel=2}, Path=DataContext.JUNK}"></Button>
当您嵌套DataGrids时,必须将AncestorLevel设置为“2”以绑定到最外层DataGrid的DataContext。
答案 1 :(得分:2)
更新
@Danny Shisler的回答是正确的。留下这个答案,因为它显示了如何在DataGridColumn
内部进行绑定,这些绑定不在Visual Tree中,并且没有DataContext
以下是一篇博文,介绍了此问题的解决方法:http://blogs.infragistics.com/blogs/josh_smith/archive/2008/06/26/data-binding-the-isvisible-property-of-contextualtabgroup.aspx
解决方法是创建一个看起来像这样的DataContextSpy
<强> DataContextSpy 强>
public class DataContextSpy
: Freezable // Enable ElementName and DataContext bindings
{
public DataContextSpy()
{
// This binding allows the spy to inherit a DataContext.
BindingOperations.SetBinding(this, DataContextProperty, new Binding());
}
public object DataContext
{
get { return (object)GetValue(DataContextProperty); }
set { SetValue(DataContextProperty, value); }
}
// Borrow the DataContext dependency property from FrameworkElement.
public static readonly DependencyProperty DataContextProperty =
FrameworkElement.DataContextProperty.AddOwner(typeof(DataContextSpy));
protected override Freezable CreateInstanceCore()
{
// We are required to override this abstract method.
throw new NotImplementedException();
}
}
然后你可以使用DataContextSpy
的实例作为DataGridColumn
s中绑定的来源
<Grid Name="LayoutRoot">
<Grid.Resources>
<local:DataContextSpy x:Key="dataContextSpy" />
</Grid.Resources>
<DataGrid ...>
<DataGrid.Columns>
<DataGridTemplateColumn Header="{Binding Path=DataContext.JUNK,
Source={StaticResource dataContextSpy}}">
<!--..-->
</DataGridTemplateColumn>
<!--..-->
</DataGrid.Columns>
</DataGrid>
</Grid>