自定义 UserControl 的自定义 DependencyProperty 未正确绑定

Custom DependencyProperty of custom UserControl not binding properly

我已经创建了自定义搜索用户控件。

public partial class HeaderSearchControl : UserControl
{
    public static DependencyProperty SearchTextProperty =
        DependencyProperty.Register("SearchText", typeof(string), typeof(HeaderSearchControl),
            new PropertyMetadata(new PropertyChangedCallback(SearchTextPropertyChanged)));

    public string SearchText
    {
        get { return (string)GetValue(SearchTextProperty); }
        set { SetValue(SearchTextProperty, value); }
    }

    public HeaderSearchControl()
    {
        InitializeComponent();
    }

    private static void SearchTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as HeaderSearchControl;
        if(control != null)
        {
            control.SearchBox.Text = (string)e.NewValue;
        }
    }
}

XAML 看起来像这样:

<Border>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0">
            <TextBox x:Name="SearchBox" Style="{StaticResource SearchTextBox}" Text="{Binding Path=SearchText}" />
        </Border>
        <StackPanel Orientation="Horizontal"  Grid.Column="1">
            <Button Style="{StaticResource IconSymbolButton}"  Content="&#xE721;" Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" Margin="0 2 2 2"/>
        </StackPanel>
    </Grid>
</Border>

视图模型中的 属性 如下所示:

private string _sessionFilter;
public string SessionFilter
{
    get { return _sessionFilter; }
    set
    {
        _sessionFilter = value;
    }
}

我是这样使用的:

<local:HeaderSearchControl VerticalAlignment="Center" 
                           SearchText="{Binding SessionFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

出于测试目的,当我在初始化时更改视图模型中 属性 的值时,显示了正确的值,程序 "reaches" 部分,其中 PropertyChangedCallback(SearchTextPropertyChanged) 已定义。

但是,当我在文本框中输入时,viewmodel 中的 属性 似乎没有更新。我错过了什么?有人可以帮帮我吗?

在当前的实现中,SearchTextPropertyChanged 删除了 Text 绑定,因此没有从 HeaderSearchControl 到绑定 属性 的更新。 SearchTextPropertyChanged 必须去:

public partial class HeaderSearchControl : UserControl
{
    public static DependencyProperty SearchTextProperty = DependencyProperty.Register
    (
        "SearchText", 
         typeof(string), 
         typeof(HeaderSearchControl),
         new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
    );

    public string SearchText
    {
        get { return (string)GetValue(SearchTextProperty); }
        set { SetValue(SearchTextProperty, value); }
    }

    public HeaderSearchControl()
    {
        InitializeComponent();
    }
}

并且绑定应该使用 HeaderSearchControl 作为源:

<TextBox Style="{StaticResource SearchTextBox}" 
         Text="{Binding Path=SearchText, RelativeSource={RelativeSource AncestorType=UserControl}}" />