我有一个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";
}
生成的窗口开始于:
如果我在UserControl(青色)上的文本框中键入内容,则只有UserControl的Label(品红色)会更新:
如果我随后单击更改DP_in_MainWindow的按钮,则仅更新MainWindow(黄色)中定义的标签。
但是如果我重新启动它并首先单击该按钮,则所有三个按钮都将正确更新:
然后再次键入会破坏绑定,并且只会更新控件的标签:
这里发生的事情以及如何使绑定保持XAML方式的绑定度。我知道我可以在C#中一起破解它,这是我所看到的大多数答案,但是必须有一种简单的“正确”方式来实现。
我已经尝试了ControlTemplates的各种组合以及按名称命名的替代绑定,...只是没有找到正确的组合。
答案 0 :(得分:1)
问题可能出在Binding.Mode
上。尝试在您的TwoWay
绑定中设置UserControl
绑定。
<local:MyUserControl VerticalAlignment="Top"
DP_in_UserControl="{Binding DP_in_MainWindow, Mode=TwoWay}"/>