contentControl中的WPF依赖关系不绑定两种



我有自定义ContentControl

public class FilteringColumnHeader : ContentControl
{
    public static readonly DependencyProperty TextFieldProperty =
        DependencyProperty.Register("TextField", typeof(string), typeof(FilteringColumnHeader), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
    public string TextField
    {
        get
        {
            return (string)GetValue(TextFieldProperty);
        }
        set { SetValue(TextFieldProperty, value); }
    }
}

使用此模板样式

<Style TargetType="{x:Type c:FilteringColumnHeader}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type c:FilteringColumnHeader}">
                <DockPanel>
                    <ContentPresenter DockPanel.Dock="Top" Content="{TemplateBinding Content}" />
                    <TextBox Text="{TemplateBinding TextField}"/>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这就是我在XAML中的DataGrid中使用它的方式

<DataGridTextColumn x:Name="NameColumn" Header="Name" Binding="{Binding Name}" Width="*" MinWidth="50">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <c:FilteringColumnHeader Content="{Binding }" Width="{Binding ActualWidth, ElementName=NameColumn}" TextField="{Binding DataContext.NameFilter, RelativeSource={RelativeSource AncestorType={x:Type local:GeneratorsListView}}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

和generatorsListView

private string nameFilter = "rec";
public string NameFilter
{
    get { return nameFilter; }
    set
    {
        nameFilter = value;
    }
}

我的问题是, Text绑定仅起作用。当我运行代码文本框时,将填充" rec",当我更改NameFilter时,文本框也会更改。但是,当我在该框中键入某些内容时,什么也不会发生(完全没有调用NameFilter的设置器)。如您所见,我尝试将模式设置为TwoWay,我可以在任何地方,仍然什么都没有。当我在 DataTemplate中恳求常规TextBox并设置完全相同的文本绑定时,它正在工作。

{TemplateBinding}是具有OneWay模式的绑定的优化版本,因此,如果您希望该属性更新,则应将普通绑定与RelativeSource设置为TemplatedParent

<ControlTemplate TargetType="{x:Type c:FilteringColumnHeader}">
    <DockPanel>
        <ContentPresenter DockPanel.Dock="Top" Content="{TemplateBinding Content}" />
        <TextBox Text="{Binding TextField, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource TemplatedParent}}"/>
    </DockPanel>
</ControlTemplate>

最新更新