1

クラス Human があり、「IsChecked」値を取得する必要があります。ItemsSource にはさまざまなタイプがありますが、すべてのクラスに IsChecked プロパティがあります。

public class Human{
    public bool IsChecked{
      get;
      set;
    }
}

private void CheckBoxLoaded(object sender, RoutedEventArgs e) //sender is CheckBox
    //How set value from IsChecked?
    var prop = t.GetType().GetProperties().Single(n => n.Name == "IsChecked");//I can access it by this method, but can't set value of sender which CheckBox;
}
4

3 に答える 3

1

何らかの理由で、クラスをリファクタリングして、を含むインターフェイスHumanを実装できないと思いますよね?ICheckableIsChecked

C# 4.0 を使用している場合、代わりにdynamicデータ型を使用することができます。これにより、実行時にのみチェックされるプロパティを設定できます。

private void CheckBoxLoaded(object sender, RoutedEventArgs e) {
     dynamic dynamicObject  = (sender as FrameworkElement).Tag;
     bool checkedState = dynamicObject.IsChecked;
}

他のすべてが失敗し、本当にリフレクションを使用する必要がある場合は、90% の方法があります。PropertyInfoオブジェクトのメソッドを呼び出してGetValue、値を取得するインスタンスを指定するだけです。

PropertyInfo prop = t.GetType().GetProperty("IsChecked"); // Simpler.
var isChecked = prop.GetValue(t, null);
(sender as CheckBox).IsChecked = isChecked;
于 2012-08-11T19:23:31.673 に答える
0

基本クラスまたは少なくともインターフェイスを使用するようにリファクタリングすることをお勧めします。ただし、それが不可能な場合は、動的を使用するだけでうまくいきます。

dynamic obj = t;
bool value = t.IsChecked;
于 2012-08-11T19:26:22.597 に答える
0

これは状態を切り替えます:

private void CheckBoxLoaded(object sender, RoutedEventArgs e)
{
        var prop = e.GetType().GetProperty("IsChecked", 
                   BindingFlags.Instance | BindingFlags.Public);
        // read the current value
        var current = (bool)prop.GetValue(sender, null);
        //and toggle it
        prop.SetValue(sender, !current, null);
} 

ベース/インターフェースへのリファクタリングはおそらくよりクリーンであり、確かにパフォーマンスが向上します。それが常に CheckBox である場合、これも単純なルートになります。

private void CheckBoxLoaded(object sender, RoutedEventArgs e)
{
        var c = sender as CheckBox;
        // read the current value
        var current = c.IsChecked;
        //and toggle it
        c.IsChecked = !current;
} 
于 2012-08-11T20:08:58.380 に答える