如何获取DataGridTemplateColumn标题绑定工作?

时间:2016-09-26 15:12:29

标签: c# wpf mvvm datagrid

Window包含一些元素和DataGridDataContext的{​​{1}}设置为WindowViewModel绑定到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">

还尝试将代理移动到窗口的资源部分,也没有帮助。

1 个答案:

答案 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"
    >