2016-04-08 13 views
0

2つのチェックボックスに基づいてコントロールを無効または有効にする必要があるフォームで作業しています。このシナリオは、約8種類のグリッドで必要とされます。私はC#を無効にしてコントロールを有効にしていますが、正常に動作しています。 8つのグリッドすべてで同じ方法を使用するにはどうすればよいですか? 私が試した最初のオプションは、親グリッドを取得することでしたが、別のグリッド内にあれば失敗します。WPFは、チェックボックスイベントにパラメータとしてグリッド名を渡すことが可能です

他のオプションは、可能であればグリッドをパラメータとして渡すことです。 可能かどうか、私に教えてください。また、これを達成するためのより良い方法があるかどうかを教えてください。

更新:私が言うことを忘れていることの1つは、チェックボックスを無効にするべきではなく、他のすべてのコントロールとそれが原因であるということです。また、グリッド全体を無効にすることは解決策ではありません。

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#コード、拡張メソッド:

私は、次のような何かを行うことができるようにしたいの後ろXAMLコードで今すぐ
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); 
     } 

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); 
      } 

     } 
+1

これまで持っていたXAMLのサンプルを含めることはできますか? –

答えて

0

Just Data IsEnabled -Propertyを設定するスタイルにチェックボックスをバインドし、そのスタイルをすべてに使用しますグリッド:

リソースとしてこのスタイルを直接使用するか、ResourceKeyを追加してグリッド単位で明示的に使用します。スタイルをUserControlに設定しましたが、基本的にはそのスタイルをWindowレベルに設定することも、Appレベルに設定することもできます。そうでない場合は、IsCheckedプロパティをそれぞれのレベルで追加するDataContextオブジェクトにバインドします。

0

DataContext MVVMスタイルを設定し、グリッドのenabledプロパティをチェックボックスcheckedプロパティにバインドすることができます。 Bindings

+0

私はすでにそれを達成しました。私は、異質のDataContextを持つ異なるグリッドにも同じメソッドを適用したかったと言いました。また、グリッド全体を無効にする必要はなく、いくつかのコントロールを無効にする必要があります。 – zulq

関連する問題