C# 在代码隐藏的方法中,绑定一个按钮可以使用其x:Name作为参数启用/Visibility属性
我需要将控件名称传递给安全对象中的一个方法,该方法返回IsEnabled属性的布尔值,另一个方法返回其可见性(折叠、隐藏或可见)。出于许可目的,必须检查这两个选项 我尝试过使用ObjectDataProvider,但所有示例都只显示用户从文本框输入的参数。我特别需要根据按钮的x:name属性将控件名传递给方法 处理这个问题最简单、最有效的方法是什么。提前谢谢 更新: 我正在尝试使用转换器,这是我提出的转换方法: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,
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'。这听起来像是转换器代码以错误的顺序从值[]中拉出项的问题,但我无法在不看到代码的情况下准确说出原因。我在原始问题中发布了一个代码示例,如果您发现任何错误,请告诉我,但它们的顺序应该正确。谢谢