Пользовательский DependencyProperty пользовательского UserControl не привязывается должным образом - PullRequest
1 голос
/ 04 марта 2020

Я создал пользовательский элемент управления для пользовательского поиска.

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 Ответ

2 голосов
/ 04 марта 2020

В текущей реализации SearchTextPropertyChanged удаляет привязку Text и, следовательно, с HeaderSearchControl не обновляются свойства привязки. SearchTextPropertyChanged должен go:

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}}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...