gpt4 book ai didi

c# - 从 DataContext 获取值到 MarkupExtension

转载 作者:太空狗 更新时间:2023-10-29 22:56:20 25 4
gpt4 key购买 nike

我正在使用 M-V-VM 模式

在我的虚拟机中我有这样的代码

public class ViewModel {
public XmlDocument Document { ... }
....
}

我有一个标记扩展,我想从中使用所述文档

  public override object ProvideValue(IServiceProvider serviceProvider) {
IProvideValueTarget valueProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (valueProvider != null) {
DependencyObject target = valueProvider.TargetObject as DependencyObject;
XmlDocument doc = Foo.GetDocument(target);
if (doc != null) {
var n = doc.SelectSingleNode("/.../text()");
if (n != null) return n.Value;
}
}
return "«" + ObjectProperty + "»";
}

我创建了附加属性 Foo.Document,并将其附加到我的页面(页面的 DataContext 设置为我的 ViewModel 类的实例

<Page ... lc:Foo.Document="{Binding Document}">
...
</Page>

(为了不必每次使用标记扩展时都将其作为参数键入)

现在,在我的标记扩展中,当我尝试读取文档附加属性时,我总是得到一个空文档。通过调试绑定(bind),它似乎是一个计时问题,因为附加属性在标记扩展运行后获得了正确的值。

有没有可能让它以某种方式工作?

最佳答案

ProvideValue 方法被调用两次,一次是在解析器评估 XAML 时,一次是在加载值时。在第一次调用时,targetObject 只是一种称为 SharedDP 的虚拟对象,而不是应用了标记扩展的对象。您需要跳过第一个调用,只处理第二个调用。这是在我们的应用程序中运行的代码。

   public override object ProvideValue(IServiceProvider serviceProvider){                                
var pvt = serviceProvider as IProvideValueTarget;
if (pvt == null)
{
return null;
}


var frameworkElement = pvt.TargetObject as FrameworkElement;
if (frameworkElement == null)
{
return this;
}
//.... Code will run once the markup is correctly loaded
var dataContext = frameworkElement.DataContext;


}

关于c# - 从 DataContext 获取值到 MarkupExtension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944087/

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