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

时间:2020-03-04 11:47:45

标签: c# wpf data-binding custom-controls dependency-properties

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

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}" />

出于测试目的,当我在初始化时更改视图模型中的属性值时,将显示正确的值,并且程序“到达”定义了PropertyChangedCallback(SearchTextPropertyChanged)的部分。

但是,当我在文本框中键入内容时,viewmodel中的属性似乎没有更新。我想念什么?有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

在当前实现中,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();
    }
}

并且Binding应该使用HeaderSearchControl作为源:

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