C# 在代码隐藏的方法中,绑定一个按钮可以使用其x:Name作为参数启用/Visibility属性

C# 在代码隐藏的方法中,绑定一个按钮可以使用其x:Name作为参数启用/Visibility属性,c#,wpf,data-binding,isenabled,objectdataprovider,C#,Wpf,Data Binding,Isenabled,Objectdataprovider,我需要将控件名称传递给安全对象中的一个方法,该方法返回IsEnabled属性的布尔值,另一个方法返回其可见性(折叠、隐藏或可见)。出于许可目的,必须检查这两个选项 我尝试过使用ObjectDataProvider,但所有示例都只显示用户从文本框输入的参数。我特别需要根据按钮的x:name属性将控件名传递给方法 处理这个问题最简单、最有效的方法是什么。提前谢谢 更新: 我正在尝试使用转换器,这是我提出的转换方法: public object Convert(object[] values,

我需要将控件名称传递给安全对象中的一个方法,该方法返回IsEnabled属性的布尔值,另一个方法返回其可见性(折叠、隐藏或可见)。出于许可目的,必须检查这两个选项

我尝试过使用ObjectDataProvider,但所有示例都只显示用户从文本框输入的参数。我特别需要根据按钮的x:name属性将控件名传递给方法

处理这个问题最简单、最有效的方法是什么。提前谢谢

更新: 我正在尝试使用转换器,这是我提出的转换方法:

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values != null)
        {
            DataTable tblPermissions = (DataTable)values[0];
            string sFunctionName = values[1].ToString();

            DataRow[] rows = tblPermissions.Select("fun_name = '" + sFunctionName + "'");
            if ((bool)rows[0]["fun_enable"])
                return true;
            else
                return false;
        }

        return string.Empty;
    }
以下是xaml:

                    <Button.IsEnabled>
                        <MultiBinding Converter="{StaticResource IsFunctionEnabledConverter}">
                            <Binding ElementName="{StaticResource PermissionsTable}" />
                            <Binding ElementName="btnSave" Path="Name" />
                        </MultiBinding>
                    </Button.IsEnabled>

根据您构建应用程序的方式,可能有不同的方法来解决此问题。如果您使用的是用户控件视图,并且取决于代码隐藏,最简单的方法可能是直接从代码隐藏调用安全对象的方法,并直接在相关控件上设置属性

如果您使用的是MVVM,或者您不喜欢代码隐藏,那么解决此问题的另一种方法可能是放弃使用按钮的名称,使用一个新的按钮。附加属性是使用WPF依赖属性框架存储对象或控件的数据的一种方法,该对象或控件最初没有声明自己

与附加属性一起出现的是一个称为附加行为的概念。本质上,当您创建一个附加属性时,您会得到一个回调的钩子,每当在对象上设置该属性时,就会调用该回调。调用此回调时,您将收到设置属性的对象以及属性的新值和旧值

您可以将回调用作对照安全对象检查属性值的机会,并根据需要设置已启用和可见的属性

--嗯
Dusty

您可以使用
{Binding RelativeSource={RelativeSource Self},Converter={StaticResource MyConverter}}编写一个IValueConverter来进行方法调用并传入控件本身。在Convert方法中,您可以将值强制转换为控件,并访问控件的Name属性以传递给安全方法。通过检查targetType,可以确定是输出布尔值(对于IsEnabled)还是可见性枚举

***更新


我假设与转换器绑定一起使用的“PermissionTable”资源实际上是DataTable,但您试图将其用作字符串,以按名称标识元素作为绑定源。尝试使用
Source=“{StaticResource PermissionsTable}”
来传递DataTable资源本身。

我尝试使用转换器,遇到的问题是转换器需要我传入安全对象才能访问权限。我创建了一个多值转换器,它使用控件名和表作为权限。我在尝试使用转换器时收到此错误:“无法将类型为'System.Data.DataTable'的对象强制转换为类型为'System.String'。这听起来像是转换器代码以错误的顺序从值[]中拉出项的问题,但我无法在不看到代码的情况下准确说出原因。我在原始问题中发布了一个代码示例,如果您发现任何错误,请告诉我,但它们的顺序应该正确。谢谢