【发布时间】:2011-02-18 20:51:29
【问题描述】:
我正在尝试将我的一个列上的数据绑定到我页面的 ViewModel 中的数据(而不是网格绑定到的对象)。
我在下面推荐了here,但无济于事。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding ElementName=LayoutRoot, Path=DataContext.JUNK}"></Button>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
在我的视图模型中
public string JUNK { get; set; }
在 ViewModel 的构造函数中设置为 "HELLO"
有人看到我做错了吗?
编辑
这是整个 XAML。相关列一直在底部,在网格内的网格中
ALSO - 我无法再次将我的整个源代码放到这里(不确定是 citrix 还是什么),但我采用了 完全相同的绑定表达式在 datagrid 的按钮中工作,我将它放到了一个远离网格的普通旧 TextBlock 的 Text 上,它就像一个魅力。我还在网格中添加了一个新的虚拟文本列,并为文本使用了相同的绑定表达式,它仍然 not 起作用。看起来这个绑定表达式很好,但拒绝在网格附近的任何地方工作。
<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>
【问题讨论】:
-
您是否有一个名为“LayoutRoot”的元素,您已在该元素上将 DataContext 设置为您的 ViewModel?您能否发布更多 XAML(特别是“LayoutRoot”元素的定义)?谢谢!
-
我根本不是 WPF 专家,但 LayoutRoot 不是内置的 - 这不是自动成为范围内最顶层的 UI 元素吗?或者这完全是错误的,我需要将 LayoutRoot 的名称添加到所述 UI 元素?其实我看得很清楚是这样的。只需将其写在答案中,我将关闭它。谢谢。
-
实际上,不,它没有。我确信它会的。现在更新问题...
-
+1,非常好的问题。我对这种行为感到非常惊讶,我发布的答案不是一个很好的解决方案,但这是我唯一能想到的。我不知道为什么它不能与 ElementName 或 RelativeSource 一起使用,但我会观察这个问题,看看是否有人对此提出了更好的解释或解决方法:)
-
@Adam Rackis:查看我的更新答案以了解解决方法