绑定失去它的绑定

时间:2018-09-12 16:18:27

标签: c# xaml data-binding dependency-properties

我有一个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();
    }
}

我有一个MainWindow:

<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

如果我在UserControl(青色)上的文本框中键入内容,则只有UserControl的Label(品红色)会更新:

I typed

如果我随后单击更改DP_in_MainWindow的按钮,则仅更新MainWindow(黄色)中定义的标签。

ButtonClick After Typing

但是如果我重新启动它并首先单击该按钮,则所有三个按钮都将正确更新:

ButtonClick first

然后再次键入会破坏绑定,并且只会更新控件的标签:

Binding broken again

这里发生的事情以及如何使绑定保持XAML方式的绑定度。我知道我可以在C#中一起破解它,这是我所看到的大多数答案,但是必须有一种简单的“正确”方式来实现。

我已经尝试了ControlTemplates的各种组合以及按名称命名的替代绑定,...只是没有找到正确的组合。

1 个答案:

答案 0 :(得分:1)

问题可能出在Binding.Mode上。尝试在您的TwoWay绑定中设置UserControl绑定。

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