gpt4 book ai didi

c# - 获取 WPF 绑定(bind)的值

转载 作者:太空狗 更新时间:2023-10-29 23:42:24 25 4
gpt4 key购买 nike

好吧,我不想在我的 MVVM ViewModel 中使用一堆 ICommand,所以我决定为 WPF 创建一个 MarkupExtension,您可以向它提供一个字符串(方法的名称),它会返回一个执行的 ICommand方法。

这是一个片段:

public class MethodCall : MarkupExtension
{
public MethodCall(string methodName)
{
MethodName = methodName;
CanExecute = "Can" + methodName;
}

public override object ProvideValue(IServiceProvider serviceProvider)
{
Binding bin = new Binding { Converter = new MethodConverter(MethodName, CanExecute) };

return bin.ProvideValue(serviceProvider);
}
}

public class MethodConverter : IValueConverter
{
string MethodName;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//Convert to ICommand
ICommand cmd = ConvertToICommand();
if (cmd == null)
Debug.WriteLine(string.Format("Could not bind to method 'MyMethod' on object", MethodName));
return cmd;
}
}

它工作得很好,除非绑定(bind)失败(例如你输入错误)。

当您在 xaml 中执行此操作时:{Binding MyPropertyName} 每当绑定(bind)失败时,您都会在输出窗口中看到。它会告诉您 propertyName 类型名称等。

MethodConverter 类可以告诉您失败的方法的名称,但不能告诉您源对象类型。因为该值将为空。

我不知道如何为下面的类存储源对象类型

public class MyClass
{
public void MyMethod()
{
}
}

和以下 xaml:

<Button Command={d:MethodCall MyMethod}>My Method</Button>

它目前说:

"Could not bind to method 'MyMethod' on object

但我想说:

"Could not bind to method 'MyMethod' on object MyClass

有什么想法吗?

最佳答案

嗯,好吧,我可以想到一个迂回的方式。可能有更简单/更清洁的东西,但试试这个:

  1. 通过 IServiceProvider 获取 IProvideValueTarget 实现。
  2. 使用目标信息为绑定(bind)属性解析一个BindingExpression
  3. 使用 BindingExpressionDataItem 属性获取源对象。

类似于:

var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var bindingExpression = BindingOperations.GetBindingExpression(provideValueTarget.TargetObject, (DependencyProperty)provideValueTarget.TargetProperty);
var source = bindingExpression.DataItem;

很糟糕,但应该可以。很可能有一项服务可以为您执行此操作,但我在 MSDN 中快速浏览了一下后找不到。

关于c# - 获取 WPF 绑定(bind)的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539364/

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