gpt4 book ai didi

c# - 我应该在 WPF 中的哪个页面声明带有自定义控件的绑定(bind)选项

转载 作者:行者123 更新时间:2023-11-30 21:30:52 25 4
gpt4 key购买 nike

我刚开始在 wpf 中制作自定义控件。
我不太了解自定义控件的绑定(bind)技术。
让我给你看我的练习。

我在cs文件中声明我的自定义控件

public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata
(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))
);
}

// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextaaProperty =
DependencyProperty.Register(
"Textaa",
typeof(string), typeof(CustomControl1),
new PropertyMetadata(null));

public string Textaa
{
get { return (string)GetValue(TextaaProperty); }
set { SetValue(TextaaProperty, value); }
}
}

在 Generic.xaml 中,我在 Generic.xaml 中为我的自定义控件声明了模板样式。

<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Background" Value="DimGray"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<TextBox Background="{TemplateBinding Background}"
Text="{Binding Textaa,
RelativeSource={RelativeSource TemplatedParent}}">
</TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

为了向我的控件发送文本,我为数据对象创建了我的自定义类,该类仅具有名称属性并且仅从 INPC 继承

    public MainWindow()
{
InitializeComponent();
DataContext = new DataObject() { name = "Jeong Yo Han" };
}

public class DataObject : INotifyPropertyChanged
{
private string _name;
public string name
{
get { return _name; }
set {
_name = value;
onPropertyChanged("name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void onPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}

在我的主窗口页面中,我声明了我的自定义控件标签

<Grid>
<cc:CustomControl1 Background="Red"
Textaa="{Binding name ,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
</cc:CustomControl1>
</Grid>

我尝试测试模板样式中的 templatedParent 是否适用于双向绑定(bind)。 (参见 RelativeSource= { Rela ... TemplatedParent } )。

然后我运行我的程序以查看我何时获得 DataObject 中的名称 setter 属性 类(class)。即使我添加了 UpdateSourceTrigger=PropertyChanged,但是当我更改我的 TextBox 中的文本时它不能很好地工作。当我失去对它的关注时它会起作用,即使我输入了 UpdateSourceTrigger=PropertyChanged。

所以我改变了我的来源,就像下面的来源一样。

<!-- in Generic.xaml (Template style) -->
<TextBox Background="{TemplateBinding Background}"
Text="{Binding Textaa,
UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource TemplatedParent}}">
</TextBox>
<!--- in MainWindow.xaml--->
<cc:CustomControl1 Background="Red"
Textaa="{Binding name ,Mode=TwoWay}" >
</cc:CustomControl1>

正如我所料,这很好用。
并且以下不起作用,不是我预期的。

<!-- in Generic.xaml (Template style) -->
<TextBox Background="{TemplateBinding Background}"
Text="{Binding Textaa,
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay,
RelativeSource={RelativeSource TemplatedParent}}">
</TextBox>
<!--- in MainWindow.xaml--->
<cc:CustomControl1 Background="Red"
Textaa="{Binding name}" >
</cc:CustomControl1>

但我很困惑为什么我应该将 UpdateSourceTrigger 选项放在 StyleTemplate 和 Mode= TwoWayBinding 选项直接放在自定义控件标签的 Textaa 依赖属性上。

我需要一个解释。感谢您的阅读。

为了帮助您理解,我在下面为我的来源添加了我的 reop。

click here to see entire source

最佳答案

更新 TextBox 的 Text 属性的 Binding 的源属性的默认行为是 LostFocus

请参阅 TextBox.Text Property 上的备注页:

When used in data-binding scenarios, this property uses the default update behavior of UpdateSourceTrigger.LostFocus.

但是您不需要设置 Mode=TwoWay,因为这已经是默认设置。所以 TextBox 声明应该是这样的:

<TextBox Background="{TemplateBinding Background}" 
Text="{Binding Textaa,
UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource TemplatedParent}}" />

没有必要在 Textaa 属性的绑定(bind)上设置 UpdateSourceTrigger=PropertyChanged,因为(与 TextBlock.Text 相比) ,您的自定义依赖项属性的默认行为已经是 PropertyChanged

您还可以以默认双向绑定(bind)的方式注册您的属性,这样您就不必在 Textaa 上设置 Mode=TwoWay绑定(bind):

public static readonly DependencyProperty TextaaProperty =
DependencyProperty.Register(
nameof(Textaa), typeof(string), typeof(CustomControl1),
new FrameworkPropertyMetadata(
null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

现在您可以像这样绑定(bind) Textaa 属性:

<cc:CustomControl1 Textaa="{Binding name}" />

关于c# - 我应该在 WPF 中的哪个页面声明带有自定义控件的绑定(bind)选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53920923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com