Wpf 将DataGrid的CellTemplate内容绑定到模板化CustomControl上定义的元素或DependencyProperty

Wpf 将DataGrid的CellTemplate内容绑定到模板化CustomControl上定义的元素或DependencyProperty,wpf,data-binding,datagrid,Wpf,Data Binding,Datagrid,我在自定义控件中使用WPF的常规数据网格。 DataGrid的单元格模板内容之一应绑定到Textblock的文本或自定义控件上的DependencyProperty。如果我能把它和他们中的任何一个绑在一起,对我来说就足够了 我尝试用ElementName进行以下绑定,但没有成功。我一直得到一个DependencyProperty.Unset值- <DataGridTemplateColumn Header="Test"> <DataGridTemplateColumn

我在自定义控件中使用WPF的常规数据网格。 DataGrid的单元格模板内容之一应绑定到Textblock的文本或自定义控件上的DependencyProperty。如果我能把它和他们中的任何一个绑在一起,对我来说就足够了

我尝试用ElementName进行以下绑定,但没有成功。我一直得到一个DependencyProperty.Unset值-

<DataGridTemplateColumn Header="Test">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <ContentPresenter>
                <ContentPresenter.Content>
                    <MultiBinding Converter="{StaticResource TextToSpecialTextblockConverter}">
                       <Binding Path="SomeTextOnTheViewModel"/>
                       <Binding ElementName="SearchBox" Path="Text" Mode="OneWay"/>
                    </MultiBinding>
                </ContentPresenter.Content>
             </ContentPresenter>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
绑定到DependencyProperty也不起作用

<DataGridTemplateColumn Header="Test">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <ContentPresenter>
                <ContentPresenter.Content>
                    <MultiBinding Converter="{StaticResource TextToSpecialTextblockConverter}">
                       <Binding Path="SomeTextOnTheViewModel"/>
                       <Binding RelativeSource="{RelativeSource Mode=TemplatedParent}" Path="SomeDP" />
                    </MultiBinding>
                </ContentPresenter.Content>
             </ContentPresenter>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我希望有人能帮助我

谢谢

如果属性是在控件或DataGrid的DataContext上的视图模型集上定义的,则此示例适用:

资源:

    <DataTemplate x:Key="template">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Test"/>
            <TextBlock Text="{Binding Path=DataContext.Property,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
        </StackPanel>
    </DataTemplate>
要使用模板绑定绑定到依赖项属性测试,请使用

<DataTemplate x:Key="template2">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Test: "/>
        <TextBlock Text="{Binding Path=Test, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:CustomControl1}}}"/>
    </StackPanel>
</DataTemplate>

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <DataGrid ItemsSource="{TemplateBinding ItemsSource}" AutoGenerateColumns="True">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="Test" CellTemplate="{StaticResource template2}" />
                        </DataGrid.Columns>
                    </DataGrid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
如果属性属性是在控件或DataGrid的DataContext上的视图模型集上定义的,则此示例适用:

资源:

    <DataTemplate x:Key="template">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Test"/>
            <TextBlock Text="{Binding Path=DataContext.Property,RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
        </StackPanel>
    </DataTemplate>
要使用模板绑定绑定到依赖项属性测试,请使用

<DataTemplate x:Key="template2">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Test: "/>
        <TextBlock Text="{Binding Path=Test, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:CustomControl1}}}"/>
    </StackPanel>
</DataTemplate>

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <DataGrid ItemsSource="{TemplateBinding ItemsSource}" AutoGenerateColumns="True">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="Test" CellTemplate="{StaticResource template2}" />
                        </DataGrid.Columns>
                    </DataGrid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

SearchBox是在DataGrid之前定义的吗?是的,它是在DataGrid之前定义的。SearchBox是在DataGrid之前定义的吗?是的,它是在DataGrid之前定义的。嘿,Phil,谢谢你的回答!但在我的例子中,没有ViewModel,只有一个带有DependencyProperties的CustomControl.cs文件。我知道我可以创建一个,这样我就可以使用你的解决方案,但这似乎有点过头了,我想知道对于这样一个简单的请求是否有更优雅的解决方案。今晚我将再次尝试绑定到依赖项属性。然而,一个更简单的解决方案是,在绑定到网格的ItemsSource之前,将多重转换器中的逻辑应用于数据。这是一个有趣的想法,虽然它看起来不像是一个标准的解决方案,但更多的是一个即兴创作,但也许它就可以了!我会尝试一下,但如果有一个优雅的解决方案,我还是更喜欢它!谢谢嘿,Phil,我一直在考虑您的解决方案,我一直在想,在itemssource上使用多重绑定是否不会影响性能,因为每次DependencyProperty更改时都会设置itemssource。这可能会经常发生,因为它实际上是一个受用户影响的文本字段。所以突然间,我不确定这个解决方案是否适用。我只是不明白为什么他们把数据网格搞砸了,所以它不能与ElementName一起工作。也许我会切换回ListView,这取决于集合的大小。如果收藏是在1000年,可能不会花太长时间,数百万将是一个问题。你必须测试一下。嘿,菲尔,谢谢你的回答!但在我的例子中,没有ViewModel,只有一个带有DependencyProperties的CustomControl.cs文件。我知道我可以创建一个,这样我就可以使用你的解决方案,但这似乎有点过头了,我想知道对于这样一个简单的请求是否有更优雅的解决方案。今晚我将再次尝试绑定到依赖项属性。然而,一个更简单的解决方案是,在绑定到网格的ItemsSource之前,将多重转换器中的逻辑应用于数据。这是一个有趣的想法,虽然它看起来不像是一个标准的解决方案,但更多的是一个即兴创作,但也许它就可以了!我会尝试一下,但如果有一个优雅的解决方案,我还是更喜欢它!谢谢嘿,Phil,我一直在考虑您的解决方案,我一直在想,在itemssource上使用多重绑定是否不会影响性能,因为每次DependencyProperty更改时都会设置itemssource。这可能会经常发生,因为它实际上是一个受用户影响的文本字段。所以突然间,我不确定这个解决方案是否适用。我只是不明白为什么他们把数据网格搞砸了,所以它不能与ElementName一起工作。也许我会切换回ListView,这取决于集合的大小。如果收藏是在1000年,可能不会花太长时间,数百万将是一个问题。你必须测试一下。
public class CustomControl1 : ItemsControl
{
    static CustomControl1()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof (CustomControl1),
            new FrameworkPropertyMetadata(typeof (CustomControl1)));
    }

    public static readonly DependencyProperty TestProperty =
        DependencyProperty.Register("Test", typeof (string), typeof (CustomControl1), new PropertyMetadata(default(string)));

    public string Test
    {
        get { return (string) GetValue(TestProperty); }
        set { SetValue(TestProperty, value); }
    }
}