C# WPF是否可以将gridname作为参数传递给checkbox事件
我正在处理一个表单,我必须根据两个复选框禁用或启用控件。在大约8个不同的网格中需要此场景。我已经做了C#来禁用/启用控件,效果很好。 现在我如何在所有8个网格上使用相同的方法? 我尝试的第一个选项是获取父网格,但如果它位于另一个网格中,则将失败 我想到的另一个选项是,如果可能,将网格作为参数传递。 请让我知道它是否可行以及如何实现。另外,请告诉我是否有更好的方法来实现这一点 更新:我忘了提到的一件事是,复选框不应该被禁用,而应该禁用所有其他控件,这就是为什么C代码被隐藏的原因。另外,禁用整个网格也不是解决方案 XAML:C# WPF是否可以将gridname作为参数传递给checkbox事件,c#,wpf,C#,Wpf,我正在处理一个表单,我必须根据两个复选框禁用或启用控件。在大约8个不同的网格中需要此场景。我已经做了C#来禁用/启用控件,效果很好。 现在我如何在所有8个网格上使用相同的方法? 我尝试的第一个选项是获取父网格,但如果它位于另一个网格中,则将失败 我想到的另一个选项是,如果可能,将网格作为参数传递。 请让我知道它是否可行以及如何实现。另外,请告诉我是否有更好的方法来实现这一点 更新:我忘了提到的一件事是,复选框不应该被禁用,而应该禁用所有其他控件,这就是为什么C代码被隐藏的原因。另外,禁用整个网格
C#代码,扩展方法:
public static void DisableAll(this IEnumerable<Control> input, List<String> filter)
{
input.Where(c => !filter.Contains(c.Name)).ToList().ForEach(c => c.IsEnabled = false);
}
public static void EnableAll(this IEnumerable<Control> input, List<String> filter)
{
input.Where(c => !filter.Contains(c.Name)).ToList().ForEach(c => c.IsEnabled = true);
}
publicstaticvoiddisableall(此IEnumerable输入,列表过滤器)
{
input.Where(c=>!filter.Contains(c.Name)).ToList().ForEach(c=>c.IsEnabled=false);
}
公共静态void enablell(此IEnumerable输入,列表筛选器)
{
input.Where(c=>!filter.Contains(c.Name)).ToList().ForEach(c=>c.IsEnabled=true);
}
现在,在XAML代码背后,我希望能够执行以下操作:
private void cbOne_Checked(object sender, RoutedEventArgs e)
{
var filter = getFilter();
var isValid = ValidateChecks();
var controls = sourceGrid.Children.OfType<Control>();
if (!isValid)
{
controls.DisableAll(filter);
}
else
{
controls.EnableAll(filter);
}
}
private void cbOne\u已选中(对象发送方、路由目标方)
{
var filter=getFilter();
var isValid=ValidateChecks();
var controls=sourceGrid.Children.OfType();
如果(!isValid)
{
控件。禁用全部(过滤器);
}
其他的
{
控件。启用全部(过滤器);
}
}
只需将复选框数据绑定到设置IsEnabled
-属性的样式,并将该样式用于所有网格:
<UserControl.Resources>
<Style TargetType={x:Type Grid}>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{ElementName=cb1, Path=IsChecked}" Value="True">
<Condition Binding="{ElementName=cb2, Path=IsChecked}" Value="True">
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<CheckBox x:Name="cb1" />
<CheckBox x:Name="cb2" />
可以直接将该样式用作资源,也可以向其添加ResourceKey并在每个网格中显式使用它。我已经将样式设置为
UserControl
,但基本上您可以将该样式设置为窗口
,或者甚至设置为App
级别,如果这些复选框可用-如果不可用,将其IsChecked属性绑定到在相应级别添加的DataContext对象。您可以设置DataContext
MVVM样式,并将网格的属性绑定到复选框选中的属性。您只需要使用绑定来检查它们
您可以包括一个到目前为止您已经拥有的XAML示例吗?我已经实现了这一点,并且记得在问题中我说过我希望相同的方法适用于具有不同数据上下文的不同网格。此外,不应禁用整个网格,而应禁用某些控件。
<UserControl.Resources>
<Style TargetType={x:Type Grid}>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{ElementName=cb1, Path=IsChecked}" Value="True">
<Condition Binding="{ElementName=cb2, Path=IsChecked}" Value="True">
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="True" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<CheckBox x:Name="cb1" />
<CheckBox x:Name="cb2" />