我遇到绑定问题。由于RelativeSource
需要视觉树向上移动并找到所需的祖先,因此您只能在 an 上使用它,UIElement
但我正在尝试对RelativeSource
Non-UIElement 进行绑定,例如 ValidationRule,众所周知,它不在内部VisualTree
也不是它的UIElement
。正如您所料,绑定中断。RelativeSource
找不到,因为就像我说的那样没有VisualTree
或LogicalTree
可用。我需要让它工作。
下面是 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 绑定表达式。
这是代码:
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 绑定表达式编译的原因。
当我运行应用程序时,绑定本身不起作用,因为无法找到 StackPanel,因为 ValidationRule 没有 VisualTree,我的验证规则也没有参与逻辑或可视树。
问题是我如何使这种情况起作用,如何从非 UIElement(例如我的 ValidationRule)中找到 StackPanel?
我为我的代码没有编译而道歉,但我希望你能理解我想要做什么。我给你们50分的正确答案。