【发布时间】:2019-10-13 11:12:26
【问题描述】:
我意识到 WPF 对我来说仍然是一种魔法。问题似乎很简单。我有一个带有按钮的用户控件。我想在点击时更改按钮内容(文本)。
如果我在没有初始化按钮值的情况下使用用户控件打开表单,然后在
void Button_Click(object sender, RoutedEventArgs e)
{
Button.Content = "New Value";
}
它有效。
如果我在控件构造函数中通过Button.Content = "Init Value"动态初始化按钮值,第二位Button.Content = "New Value"
永远不会发生(它会发生,但按钮文本不会再显示更改,至少看起来是这样)。
所以我决定使用绑定。在 MyUserControl 中声明 ButtonText 属性(+ 带有 getter 和 setter 的相应 DependencyProperty)并尝试在构造函数中执行 ButtonText = "Init Value"; 并在 Button_Click() 中执行 ButtonText = "New Value";。第一个有效,第二个仍然无效。我假设是因为Button_Click() 中的数据上下文错误?
在 MyUserControl 中我尝试了一些方法,包括
<Button x:Name="Button"
Content="{Binding Path=ButtonText, RelativeSource={RelativeSource AncestorType=UserControl}}"
Click="Button_Click" />
<Button x:Name="Button"
Content="{Binding Path=ButtonText, Element=MyUserControl}"
Click="Button_Click" />
似乎没有任何效果。
实现我需要的最简单方法是什么,即动态初始化和动态更改?如果可能的话,请解释一下为什么我的第一种(直接)方法不起作用以及缺少什么绑定方法。
非常感谢!
编辑:
另一种方法是使用触发器。
这个例子有效:
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content" Value="Init Value"/>
<Style.Triggers>
<Trigger Property="IsClicked" Value="True">
<Setter Property="Content" Value="New Value" />
</Trigger>
</Style.Triggers>
</Style>
我的问题是我需要一个 DataTrigger,像这样
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Content" Value="Init Value"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=MyUserControlProperty, ElementName=MyUserControl}" Value="True">
<Setter Property="Content" Value="New Value" />
</DataTrigger>
</Style.Triggers>
</Style>
如何使 MyUserControlProperty 值更改正确传播?
最有趣的是,如果我以新形式打开控件,Button.Content = "Init Value" 的初始化不会搞砸一切,一切正常。什么?为什么这个简单的任务这么难,为什么会有这么多行为?
【问题讨论】:
-
如果不查看 UserControl 的所有相关代码部分,很难判断哪里出错了。您可能混淆了 UserControl 中的元素名称。当您像这样编写它时,通过单击处理程序总是更改按钮的内容:
((Button)sender).Content = "New Value";
标签: wpf button user-controls