我意识到WPF对我来说仍然是一大魔咒。问题似乎很简单。我有一个带有按钮的用户控件。我想更改单击时的按钮内容(文本)。
如果我使用用户控件打开表单而不初始化按钮值,然后在
中说lambda x: x is not None
有效。
如果我通过void Button_Click(object sender, RoutedEventArgs e)
{
Button.Content = "New Value";
}
在控件构造函数中动态初始化按钮值,则第二位Button.Content = "Init Value"
永远不会发生(它会发生,但是按钮文本不会再显示该更改,至少不会显示该更改)。
因此,我决定使用绑定。在MyUserControl中声明了Button.Content = "New Value"
属性(以及带有getter和setter的相应DependencyProperty),并尝试在构造函数中执行ButtonText
,在ButtonText = "Init Value";
中进行了ButtonText = "New Value";
。第一个起作用,第二个仍然不起作用。我认为是因为Button_Click()
中的数据上下文错误?
在MyUserControl中,我尝试了一些操作,包括
Button_Click()
似乎没有任何作用。
实现我所需的最简单的方法是什么,即动态初始化和动态更改?如果可能的话,请解释一下为什么我的第一个(直接)方法不起作用以及缺少什么绑定方法。
非常感谢!
编辑:
一种替代方法是使用触发器。
此示例有效:
<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" />
我的问题是我需要这样的DataTrigger
<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>
如何使MyUserControlProperty值更改正确传播?
最有趣的是,如果我以新形式打开控件,则<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>
的初始化不会使事情搞砸,一切都会正常进行。什么啊为什么这个简单的任务如此困难,为什么会有如此众多的行为?
答案 0 :(得分:-1)
当您在其上设置了绑定时,请不要直接设置Button.Content。如果在构造函数中设置Button.Content,则可以有效地删除绑定。 这有效:
<Window x:Class="StackOverflow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<Button Content="{Binding Path=ButtonText1, RelativeSource={RelativeSource AncestorType=Window}}" Click="Button1_OnClick"></Button>
</StackPanel>
</Window>
using System.Windows;
namespace StackOverflow
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
ButtonText1 = "Paul";
}
private void Button1_OnClick(object sender, RoutedEventArgs e)
{
ButtonText1 = "Maria";
}
public string ButtonText1
{
get => (string)GetValue(ButtonText1Property);
set => SetValue(ButtonText1Property, value);
}
// Using a DependencyProperty as the backing store for ButtonText1. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ButtonText1Property =
DependencyProperty.Register("ButtonText1", typeof(string), typeof(MainWindow), new PropertyMetadata("Peter"));
}
}