【发布时间】:2016-04-08 09:35:46
【问题描述】:
我正在处理一个表单,我必须根据两个复选框禁用或启用控件。在大约 8 个不同的网格中需要此方案。我已经完成了 C# 来禁用/启用控件,并且工作正常。 现在如何在所有 8 个网格中使用相同的方法? 我尝试的第一个选项是获取父网格,但如果它在另一个网格中,则会失败。
我想到的另一个选项是尽可能将网格作为参数传递。 请让我知道它是否可行以及如何。如果有更好的方法来实现这一点,请告诉我。
更新:我忘记提到的一件事是复选框不应该被禁用,而是所有其他控件都应该被禁用,这就是 C# 代码背后的原因。禁用整个网格也不是解决方案。
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="CatelDemo.Views.Stack"
Title="Stack" Height="338" Width="644">
<Grid >
<TabControl>
<TabItem Name="TabOne">
<Grid x:Name="GridOne">
<CheckBox x:Name="cbOneGridOne" Checked="cbOne_Checked" Unchecked="cbOne_Checked" />
<CheckBox x:Name="cbTwoGridOne" Checked="cbOne_Checked" Unchecked="cbOne_Checked" />
<!-- Other controls that should be disable-->
</Grid>
</TabItem>
<TabItem >
<Grid x:Name="GridTwo">
<CheckBox x:Name="cbOneGridTwo" Checked="cbOne_Checked" Unchecked="cbOne_Checked" />
<CheckBox x:Name="cbTwoGridTwo" Checked="cbOne_Checked" Unchecked="cbOne_Checked" />
<!-- Other controls that should be disable-->
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>
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);
}
现在在 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);
}
}
【问题讨论】:
-
您能否附上您目前拥有的 XAML 示例?