WPF コントロールの Binding.Mode=Default のデフォルトは何ですか?
-
22-09-2019 - |
質問
WPF で Binding.Mode
, を選択するとき デフォルト, 、それはバインドされているプロパティによって異なります。
さまざまなコントロールのデフォルトのリスト、規則、または情報を探しています。
つまり、プロパティとは何ですか TwoWay
デフォルトなどで。リンク、アイデア、考え、さらには暴言も大歓迎です。
解決
updatesourcetriggerと同様に、モードプロパティのデフォルト値は各プロパティごとに異なります。次のようなユーザー編集可能なプロパティ
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, 、などがありますTwoWay
デフォルトのモード値として。デフォルトがあるかどうかを把握しますTwoWay
, 、プロパティの依存関係プロパティ情報セクションを見てください。それが言うならBindsTwoWayByDefault
trueに設定されている場合、プロパティのデフォルトモード値はTwoWay
. 。プログラムで行うには、電話をかけてプロパティのプロパティメタデータを取得しますGetMetadata
次に、ブール値を確認します の値BindsTwoWayByDefault
財産。
最も安全な方法は、バインディングにどのようなバインディング モードが必要かを常に明示することです。
他のヒント
DP でサポートされているデフォルト モードを見つける方法は次のとおりです。
.NET Reflector はあなたの友達です。リフレクター付きで探す
TextBox
そして 静的コンストラクタ (.cctor()
)。ここで、 は、登録に使用されたコードを見つけることができます。TextProperty
DP:TextProperty = DependencyProperty.Register ( "Text", typeof(string), typeof(TextBox), new FrameworkPropertyMetadata ( string.Empty, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(TextBox.OnTextPropertyChanged), new CoerceValueCallback(TextBox.CoerceText), true, UpdateSourceTrigger.LostFocus ) );
Register メソッドに渡されるパラメーターが、 デフォルトのバインドモード:
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault
. 。使用する場合 リフレクタを使用してTextBlockのテキストDPの登録を確認するには、 はそのような値が渡されていないことがわかるので、その場合は バインドは、既定では一方向です。
Bea Stollnitz の投稿から引用: テンプレート内の明示的なバインディングを更新するにはどうすればよいですか?
ただし、重要な DP のリストがあると非常に役立ちます。
リストも探していましたが、主にパフォーマンスを向上させるためにどのバインディングを一方向に設定できるかを調べるためでした。次の関数は、デフォルトで双方向バインディングを使用するコントロールを見つけるのに役立ちます。
public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj)
{
var result = new List<DependencyProperty>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.Valid) }))
{
var dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
result.Add(dpd.DependencyProperty);
}
}
return result;
}
public bool IsBindsTwoWayByDefault(DependencyObject obj, DependencyProperty property)
{
var metadata = property.GetMetadata(obj) as FrameworkPropertyMetadata;
if (metadata != null)
{
return metadata.BindsTwoWayByDefault;
}
return false;
}
print 関数を使用すると、リストが得られます。
var objList = new List<DependencyObject> { new TextBox(), new TextBlock(), new Label(), new ComboBox(), new Button() };
foreach (var obj in objList)
{
var props = GetAttachedProperties(obj);
foreach (var prop in props)
{
if(IsBindsTwoWayByDefault(obj, prop))
Debug.WriteLine($"{obj} : {prop.OwnerType}:{prop.Name}");
}
}
サンプル結果 (デフォルトとして双方向バインディングを持つコントロール プロパティ)
System.Windows.Controls.TextBox : System.Windows.Controls.TextBox:Text
System.Windows.Controls.TextBox : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.TextBlock : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Label : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:IsDropDownOpen
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedIndex
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedItem
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedValue
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Button : System.Windows.Controls.TextSearch:Text
興味深いことに、ほとんどのコントロールには、双方向バインディングを持つ TextSearch プロパティがあります。