42118


お世話になっております。  
wpfの質問と迷ったのですがこちらに質問させて頂きます。

現在、stackpanelの子要素の取得しforeachで回そうとしているのですが子要素が入らずforeach  
が回らずなぜ値が入らないのか調べても原因が分からない状態です。  
下記のコードで行っているのですが、なにか原因があればご指摘ご教授よろしくお願いいたします。

[code]

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes;
    
    namespace WpfApp1 {
        /// <summary>
        /// MainWindow.xaml の相互作用ロジック
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
            }
    
            bool _textreadonly = true;
            bool _checkd = true;
    
            //xml出力用の保存用クラスのインスタンス生成
            Class1 test = new Class1();
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                //TextBoxのインスタンス生成
                TextBox textBox = new TextBox();
                var value = textvalue.Text;
    
                //Radioボタンのインスタンス生成
                RadioButton radio = new RadioButton();
    
                if (value == null)
                {
                    MessageBox.Show("登録内容を入力してからボタンを押下してください。");
                }
                else
                {             
                    ////テキスト内容をxmlに出力するメソッド呼出
                    //Class2 class2 = new Class2();
                    //class2.Xmlwrite(value);
    
                    //動的にTextBoxとラジオボタンを追加
                    StackPanel panel = new StackPanel();
                    panel.Orientation = Orientation.Horizontal;
                    radio.GroupName = "name";
                    panel.Children.Add(textBox);
                    panel.Children.Add(radio);
                    stack2.Children.Add(panel);
    
                    //動的に作成したTextBoxに値を代入
                    textBox.Text = value;
    
                    //動的に作成したTextBoxを読み取り専用にする
                    textBox.IsReadOnly = _textreadonly;
    
                    //RadioButtonのタグプロパティにTextBoxをセット
                    radio.Tag = textBox;
    
                    //Radioボタンのクリックイベント追加
                    radio.Click += Radio_Click;
    
                    //登録完了メッセージ
                    //MessageBox.Show("登録が完了しました。");
                }
            }
    
            private void Radio_Click(object sender, RoutedEventArgs e)
            {
                //senderにセットされいるオブジェクトをRadioButtonにキャストして変数に格納
                var radiocast = (RadioButton)sender;
    
                //Tagの中に格納されているTextBoxオブジェクトをTextBoxにキャストして変数に格納
                var textcast = (TextBox)radiocast.Tag;
    
                //以下、今回質問の場所
                foreach (var test in stack2.Children.OfType<RadioButton>())
                {
                    if (test.IsChecked == true)
                    {
                        textcast.IsReadOnly = false;
                    }
                    else
                    {
                        textcast.IsReadOnly = true;
                    }
                }
            }
        } 
    }
    
[/code]


CC BY-SA 3.0
2018-03-04T06:00:44.443
42117
2018-03-04T09:26:25.437
27606
question
c# wpf
c# stackpanelの子要素の取得について


`RadioButton`は`stack2`の子要素ではなく孫要素ですので、`Children`内を2段階に分けて検索する必要があります。

[code]

    foreach (var panel in stack2.Children.OfType<StackPanel>())
    {
        foreach (var test in panel.Children.OfType<RadioButton>())
        {
            textcast.IsReadOnly = !test.IsChecked;
        }
    }
    
[/code]

なお質問にあるコードでは繰り返し処理を行っていますが、繰り返す内容が`textcast.IsReadOnly`の設定のみですので結局最後の一回だけの値が採用され、どの`RadioButton`をクリックしても一番最後に追加した`RadioButton`の`IsChecked`が反映されることになります。  
要件が分からないですが、同じパネルに含まれるコントロール同士で処理をすべきではないかという気がします。


CC BY-SA 3.0
2018-03-04T06:52:28.993
42118
2018-03-04T06:52:28.993
5750
42117
answer