Window
包含一些元素和DataGrid
。 DataContext
的{{1}}设置为Window
,ViewModel
绑定到DataGrid
的{{1}}:
Property
现在我想将ViewModel
的{{1}}绑定到<DataGrid ItemsSource="{Binding FilteredMessages}" AutoGenerateColumns="False" >
的属性,例如:
Header
在正确显示网格内容的同时,Header无法绑定。
我在http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/找到了BindingProxy的描述但未能使其正常工作。该解决方案需要DataGrid中的资源
Column
以及ViewModel
子句中对该代理的引用:
<DataGrid.Columns>
<DataGridTemplateColumn Header="{Binding TimeColumnHeaderText}" Width="Auto" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding (logging:LogMessage.Time), StringFormat=\{0:yyyy-MM-dd HH:mm:ss.fff\}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我使用 <DataGrid.Resources>
<wpfUtilities:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
替换了资源部分中的Binding
,但在代理上找不到该属性:
<DataGridTemplateColumn Header="{Binding TimeColumnHeaderText, Source={StaticResource proxy}}" Width="Auto" IsReadOnly="True">
还尝试将代理移动到窗口的资源部分,也没有帮助。
答案 0 :(得分:3)
请记住,您将{Binding}
绑定到代理的Data
媒体资源:
<wpfUtilities:BindingProxy x:Key="proxy" Data="{Binding}" />
这条线是你原来拥有它的方式是正确的。这是错误的约束力。代理本身不是对viewmodel的引用。其Data
属性是对viewmodel的引用。您只是忽略了示例中的一个小细节:您需要在viewmodel属性的路径中包含源Data
属性:
<DataGridTemplateColumn
Header="{Binding Data.TimeColumnHeaderText, Source={StaticResource proxy}}"
Width="Auto"
IsReadOnly="True"
>