【问题标题】:Binding to UserControl.Resource from within datatemplate created in Code (WPF)从在代码 (WPF) 中创建的数据模板中绑定到 UserControl.Resource
【发布时间】:2019-06-23 12:31:44
【问题描述】:

我想从数据模板中引用我的数据上下文。在 XAML 中它工作正常:我创建了一个从 DataTemplate 内部作为 staticResource 引用的 BindingProxy,因此我可以访问所需的属性。

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:BindingProxy x:Key="DataContextProxy" Data="{Binding}" />
    </ResourceDictionary>
</UserControl.Resources>

<Grid>
    <Grid.Resources>
        <helpers:ComboBoxPerformanceConverter x:Key="AntriebsArtConverter" LookupDictionary="{Binding Source={StaticResource DataContextProxy}, Path=Data.AntriebsArtenDict }" />
    </Grid.Resources>
    ...

    <telerik:RadGridView ItemsSource="{Binding MyItemSource }">
        <telerik:RadGridView.Columns>
            <telerik:GridViewComboBoxColumn                 
                ItemsSource="{Binding Source={StaticResource DataContextProxy}, Path=Data.AntriebsArten}"
                DataMemberBinding="{Binding Fahrzeug.AntriebsArtId}"
                SelectedValueMemberPath="AntriebsArtId"
                DisplayMemberPath="Bezeichnung">
                <telerik:GridViewComboBoxColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Fahrzeug.AntriebsArtId, Converter={StaticResource AntriebsArtConverter}}" />
                    </DataTemplate>
                </telerik:GridViewComboBoxColumn.CellTemplate>
            </telerik:GridViewComboBoxColumn>
        </telerik:RadGridView.Columns>
...

如果我在代码中尝试相同的操作,除了 LookupDictionary 的绑定之外,我一切都可以正常工作。在这里,我尝试不是从数据网格而是从周围的 UserControl 引用数据上下文。它给了我错误“找不到名称为“DataContextProxy”的资源。关于如何解决这个问题的任何建议?

Private Function CreateDataTemplate(textblockName As String) As DataTemplate
    Dim memoryStream As MemoryStream
    Dim parserContext As New ParserContext()
    Dim xaml = "<DataTemplate xmlns:helpers=""clr-namespace:ViewModel.Helpers;assembly=ViewModel"">"
    xaml += "<DataTemplate.Resources>"
    xaml += "<helpers:ComboBoxPerformanceConverterVm x:Key=""AntriebsArtConverter""  LookupDictionary=""{Binding Path=Data.AntriebsArtenDict, Source={StaticResource DataContextProxy}}""/>"
    xaml += "</DataTemplate.Resources><TextBlock Text=""{Binding  Fahrzeug.AntriebsArtId, Converter={StaticResource AntriebsArtConverter}}"" /></DataTemplate>"
    memoryStream = New MemoryStream(Encoding.UTF8.GetBytes(xaml))
    parserContext.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
    parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")
    Dim dataTemplate = CType(XamlReader.Load(memoryStream, parserContext), DataTemplate)
    Return dataTemplate
End Function

提前感谢您的帮助!

【问题讨论】:

    标签: wpf vb.net telerik-grid


    【解决方案1】:

    在您的 xaml 文件中,helpers:ComboBoxPerformanceConverterVm 是在外部定义的,它的“DataContext”是 UserControl,并且知道 DataContextProxy。

    但在代码中,您将此转换器移动到 DataContext 中,此转换器现在是:“列”。

    最好的解决方案是将此转换器定义移到您在 Xaml 中所做的之外。

    【讨论】:

    • 感谢您的提示。我使用动态列并生成组合框,因此没有外部对象,或者我可以以某种方式包装组合框吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2016-07-25
    • 2014-04-30
    相关资源
    最近更新 更多