gpt4 book ai didi

c# - wpf本地和外部绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:33:29 28 4
gpt4 key购买 nike

我有一个带有两个 DependencyProperties 的自定义控件。一种类型对象,它允许用户像其他控件一样添加自定义内容,以及一种在文本框中使用的类型字符串:

public object NoResultContent
{
get { return (object)GetValue(NoResultContentProperty); }
set { SetValue(NoResultContentProperty, value); }
}

public static readonly DependencyProperty NoResultContentProperty =
DependencyProperty.Register("NoResultContent", typeof(object), typeof(AdvancedAutoCompleteBox), new PropertyMetadata(null));

public string FilterText
{
get { return (string)GetValue(FilterTextProperty); }
set { SetValue(FilterTextProperty, value); }
}

public static readonly DependencyProperty FilterTextProperty =
DependencyProperty.Register("FilterText", typeof(string), typeof(AdvancedAutoCompleteBox),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal,
new PropertyChangedCallback(OnFilterTextPropertyChanged), new CoerceValueCallback(CoerceText),
true, UpdateSourceTrigger.PropertyChanged));
ControlTemplate好像:
<ControlTemplate
TargetType="{x:Type local:SpecialBox}">
<StackPanel>
<TextBox
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FilterText}" />
<ContentPresenter
ContentSource="NoResultContent" />
</StackPanel>
</ControlTemplate>

我这样使用它:
<Controls:SpecialBox
Name="Box">
<Controls:SpecialBox.NoResultContent>
<Button
Content="Add value"
CommandParameter="{Binding ElementName=Box, Path=FilterText}"
Command="{Binding AddProject}" />
</Controls:SpecialBox.NoResultContent>
</Controls:SpecialBox>

<TextBlock Text="{Binding ElementName=Box, Path=FilterText}" />
DataContext我的 Window设置为我的 ViewModel。所以绑定(bind)到 ICommand作品。提供一个常量字符串作为 CommandParameter 将根据需要将其传递给 ICommand。
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}"

将“添加值”传递给我的 ICommand 实现。

ElementName 绑定(bind),如上所述和以下代码
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Controls:SpeicalBox}, Path=FilterText}"

不起作用。找不到来源。

CommandParameter="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FilterText}"

不会抛出警告,但总是返回 null。

更多信息:
每次更改都会触发我的 dp 的 OnFilterTextPropertyChanged 事件。所以值是可用的,这就是 TextBlock 的原因s Text Binding 到 SpecialBox 的效果很好。

在我的 ViewModel 上为 FilterText 值提供第二个属性将是一种解决方法,但是我如何能够从第二个属性访问本地 dp?

最佳答案

在这种情况下,正确的绑定(bind)方法是使用 RelativeSourceFindAncestor模式:

CommandParameter="{Binding FilterText,
RelativeSource={RelativeSource AncestorType=Controls:SpeicalBox}}"

此外,使用 ElementName应该可以正常工作。

现在为什么它不起作用是因为您使用的是 TemplateBindingTextBox在您的模板中。 TemplateBinding单向工作,所以无论您在 TextBox 中输入什么内容未推回您的 FilterText属性(它旨在通过在编译时解析而不像在运行时解析的普通绑定(bind)更有效地将 BackgroundBorderBrush 等属性转发到模板)。因此,您需要做的是将其替换为带有 RelativeSource 的普通绑定(bind)。在 TemplatedParent模板中的模式:
<TextBox Text="{Binding FilterText, RelativeSource={RelativeSource TemplatedParent}}" />

这至少解决了我根据您提供的代码设法重现的问题(这是我的第一个怀疑)。然而,它确实与您声称 TextBlock 上的约束力相矛盾。确实有效。因此,我建议您尝试一下,如果它不能解决您的问题,请返回。

关于c# - wpf本地和外部绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44704153/

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