gpt4 book ai didi

wpf - 绑定(bind)到非 UIElement

转载 作者:行者123 更新时间:2023-12-04 05:03:02 24 4
gpt4 key购买 nike

我遇到绑定(bind)问题。由于RelativeSource需要视觉树向上移动并找到所需的祖先,您只能在 UIElement 上使用它但我正在尝试做一个 RelativeSource绑定(bind)在非 UIElement 上,例如 ValidationRule,众所周知,它不在 VisualTree 中。也不是它的UIElement .正如您所料,绑定(bind)中断。 RelativeSource找不到,因为就像我说的没有 VisualTreeLogicalTree可用的。我需要让它工作。

下面是 XAML 的一个示例:

<StackPanel DataContext{Binding}>
<Grid>
<ContentControl Content{Binding MVPart1>
<TextBox>
<TextBox.Text>
<Binding Path="VMPart1Property1">
<Binding.ValidationRules>
<my:MyValidationRule>
<my:ValidationRule.DOC>
<my:DepObjClass DepProp={Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}/>
</my:ValidationRule.DOC>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</ContentControl>
</Grid>
</StackPanel>

所以基本上 MyValidationRule 派生自 ValidationRule 类,但那不是 UIElement 也不是 DependencyObject ,因此我必须创建一个派生自 DependencyObject 的类,称为 DepObjClass 才能写下 xaml 绑定(bind)表达式。

这是代码:
public class MyValidationRule : ValidationRule
{
public DepObjClass DOC
{
get;
set;
}

public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
string text = value as string;
if (!string.IsNullOrEmpty(text))
{
return new ValidationResult(true, string.Empty);
}

return new ValidationResult(false, "Not working blahhh");
}
}

public class DepObjClass : DependencyObject
{
public object DepProp
{
get
{
return (object)GetValue(DepPropProperty);
}
set
{
SetValue(DepPropProperty, value);
}
}

public static DependencyProperty DepPropProperty
= DependencyProperty.Register(typeof(object), typeof(DepObjClass)......);
}

现在来总结一下。 MyValidatonRule 不是 UIElement 它不是 DependencyObject 但它具有类型的属性,因此 xaml 绑定(bind)表达式编译的原因。

当我运行应用程序时,绑定(bind)本身不起作用,因为无法找到 StackPanel,因为 ValidationRule 没有 VisualTree,我的验证规则也没有参与逻辑或可视树。

问题是如何使这种情况起作用,如何从非 UIElement(例如我的 ValidationRule)中找到 StackPanel?

我为我的代码没有编译而道歉,但我希望你能理解我想要做什么。
我给你们50分的正确答案。

最佳答案

您可以执行以下操作:

  • 创建一个从 Freezable 派生的辅助组件,并为您要绑定(bind)的内容定义一个 DependencyProperty。
  • 创建一个带有属性的 ValidationRule,该属性接受帮助组件的对象,类似于您已经完成的操作。
  • 在对象的资源中声明一个辅助组件的实例,该对象可以绑定(bind)到您想要绑定(bind)的任何内容。 Freezable 及其派生类继承了在其资源中声明它们的任何控件的绑定(bind)上下文(逻辑树中的位置),因此您可以在那里创建绑定(bind)。
  • 声明 ValidationRule 时,使用 {StaticResource} 将帮助程序组件分配给 ValidationRule 中的属性。只要在使用资源之前声明了资源,StaticResource 就可以在没有绑定(bind)上下文的情况下工作。

  • XAML 看起来像这样:
    <StackPanel>
    <StackPanel.Resources>
    <my:Helper x:Key="helper" ValProperty="{Binding}"/>
    </StackPanel.Resources>
    <Grid>
    <TextBox DataContext="{Binding MVPart1}">
    <TextBox.Text>
    <Binding Path="VMPart1Property1">
    <Binding.ValidationRules>
    <my:MyValidationRule Helper="{StaticResource helper}"/>
    </Binding.ValidationRules>
    </Binding>
    </TextBox.Text>
    </TextBox>
    </Grid>
    </StackPanel>

    关于wpf - 绑定(bind)到非 UIElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15879164/

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