Связывание теряет связывание - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть UserControl

Мои привязки начинают работать, а затем исчезают, когда я взаимодействую с элементом управления.

<Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                            AncestorType={x:Type local:MyUserControl}}}">
    <StackPanel Orientation="Horizontal">
        <TextBox Width="100" Background="Cyan"
                 Text="{Binding Path=DP_in_UserControl,
                                FallbackValue='Fallback',
                                TargetNullValue='TargetNull',
                                UpdateSourceTrigger=PropertyChanged}"/>
        <Label Width="100" Background="Magenta"
               Content="{Binding Path=DP_in_UserControl,
                                 FallbackValue='Fallback',
                                 TargetNullValue='TargetNull'}"/>
    </StackPanel>
</Grid>

public partial class MyUserControl : UserControl
{
    public string DP_in_UserControl
    {
        get { return (string)GetValue(DP_in_UserControlProperty); }
        set { SetValue(DP_in_UserControlProperty, value); }
    }
    public static readonly DependencyProperty DP_in_UserControlProperty =
        DependencyProperty.Register("DP_in_UserControl", typeof(string),
            typeof(MyUserControl), new PropertyMetadata("UC Default"));

    public MyUserControl()
    {
        InitializeComponent();
    }
}

У меня есть главное окно:

<StackPanel Margin="25">
    <local:MyUserControl VerticalAlignment="Top"
                         DP_in_UserControl="{Binding DP_in_MainWindow}"/>
    <Label Background="Yellow"
           Content="{Binding DP_in_MainWindow,
                             FallbackValue='Fallback',
                             TargetNullValue='TargetNull'}"/>
    <Button Content="Change DP__in__MainWindow"
            Click="Button_Click"/>
</StackPanel>

public partial class MainWindow : Window
{
    public string DP_in_MainWindow
    {
        get { return (string)GetValue(DP_in_MainWindowProperty); }
        set { SetValue(DP_in_MainWindowProperty, value); }
    }
    public static readonly DependencyProperty DP_in_MainWindowProperty =
        DependencyProperty.Register("DP_in_MainWindow", typeof(string),
            typeof(MainWindow), new PropertyMetadata("MW Default"));

    public MainWindow()
    {
        DataContext = this;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e) =>
        DP_in_MainWindow = "Changed";
}

Сгенерированное окно начинается с:

Startup state

Если я введу TextBox на UserControl (голубой), обновятся только метка UserControl (пурпурный):

I typed

Если я затем нажму на кнопку, которая изменяет DP_in_MainWindow, обновится только метка, определенная в MainWindow (желтая).

ButtonClick After Typing

НО, если я перезапущу его и сначала нажму кнопку, все три обновятся правильно:

ButtonClick first

А затем повторный набор нарушает привязки и обновляет только метку элемента управления:

Binding broken again

Что здесь происходит и как мне сделать так, чтобы привязки сохранили свою связь в стиле XAML. Я знаю, что мог бы взломать это вместе в C #, и это большая часть ответов, которые я вижу, но должен быть простой «правильный» способ сделать это.

Я экспериментировал со всевозможными комбинациями шаблонов ControlTemplate и альтернативных привязок по имени и ... просто не нашел правильную комбинацию.

1 Ответ

0 голосов
/ 12 сентября 2018

Проблема может быть с Binding.Mode.Попробуйте установить привязку TwoWay на привязку UserControl.

<local:MyUserControl VerticalAlignment="Top"
                     DP_in_UserControl="{Binding DP_in_MainWindow, Mode=TwoWay}"/>
...