WPF/バインディング
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(WPF/バインディング);
*目次 [#kb03ff08]
#contents
*参考情報 [#hc0686eb]
*Tips [#n9a62b2d]
**Bindingを複製する [#j5fca92a]
-[[c# - Binding does not have a Clone method, whats an ef...
-BindingクラスにはCloneが存在しないので自前でコピーするし...
**BindingExpressionからソースのプロパティ値を取得する [#z...
-[[c# - How to resolve bound object from bindingexpressio...
-binding.PathよりPropertyInfoを使って簡単にとれそうだが、...
-まじめにやるには次の通り(ただしインデックスには対応して...
#pre{{
public static T GetValue<T>(this BindingExpression expres...
{
if (expression == null || dataItem == null)
{
return default(T);
}
string bindingPath = expression.ParentBinding.Path.Pa...
string[] properties = bindingPath.Split('.');
object currentObject = dataItem;
Type currentType = null;
for (int i = 0; i < pathParts.Length; i++)
{
currentType = currentObject.GetType(); ...
PropertyInfo property = currentType.GetProperty(p...
if (property == null)
{
currentObject = null;
break;
}
currentObject = property.GetValue(currentObject, ...
if (currentObject == null)
{
break;
}
}
return (T)currentObject;
}
}}
-一時的にダミーのバインディングを作って値を取得する荒技。
#pre{{
public static class PropertyPathHelper
{
public static object GetValue(object obj, string prop...
{
Binding binding = new Binding(propertyPath);
binding.Mode = BindingMode.OneTime;
binding.Source = obj;
BindingOperations.SetBinding(_dummy, Dummy.ValueP...
return _dummy.GetValue(Dummy.ValueProperty);
}
private static readonly Dummy _dummy = new Dummy();
private class Dummy : DependencyObject
{
public static readonly DependencyProperty ValuePr...
DependencyProperty.Register("Value", typeof(o...
}
}
}}
*トラブルシューティング [#ma2cdb51]
**ItemsSourceにバインディングしているのに表示されない。 [...
-例えばViewModeを以下のように定義し、MessagesをItemsSourc...
#pre{{
public LogWindowVM()
{
Messages = new ObservableCollection<string>();
Messages.Add("abc");
Messages.Add("def");
}
public ObservableCollection<string> Messages;
}}
-それはWPFのバインディングがプロパティに対して働くため。p...
-ということで。以下のようにする。
#pre{{
public LogWindowVM()
{
Messages = new ObservableCollection<string>();
Messages.Add("abc");
Messages.Add("def");
}
public ObservableCollection<string> Messages {get...
}}
終了行:
&tag(WPF/バインディング);
*目次 [#kb03ff08]
#contents
*参考情報 [#hc0686eb]
*Tips [#n9a62b2d]
**Bindingを複製する [#j5fca92a]
-[[c# - Binding does not have a Clone method, whats an ef...
-BindingクラスにはCloneが存在しないので自前でコピーするし...
**BindingExpressionからソースのプロパティ値を取得する [#z...
-[[c# - How to resolve bound object from bindingexpressio...
-binding.PathよりPropertyInfoを使って簡単にとれそうだが、...
-まじめにやるには次の通り(ただしインデックスには対応して...
#pre{{
public static T GetValue<T>(this BindingExpression expres...
{
if (expression == null || dataItem == null)
{
return default(T);
}
string bindingPath = expression.ParentBinding.Path.Pa...
string[] properties = bindingPath.Split('.');
object currentObject = dataItem;
Type currentType = null;
for (int i = 0; i < pathParts.Length; i++)
{
currentType = currentObject.GetType(); ...
PropertyInfo property = currentType.GetProperty(p...
if (property == null)
{
currentObject = null;
break;
}
currentObject = property.GetValue(currentObject, ...
if (currentObject == null)
{
break;
}
}
return (T)currentObject;
}
}}
-一時的にダミーのバインディングを作って値を取得する荒技。
#pre{{
public static class PropertyPathHelper
{
public static object GetValue(object obj, string prop...
{
Binding binding = new Binding(propertyPath);
binding.Mode = BindingMode.OneTime;
binding.Source = obj;
BindingOperations.SetBinding(_dummy, Dummy.ValueP...
return _dummy.GetValue(Dummy.ValueProperty);
}
private static readonly Dummy _dummy = new Dummy();
private class Dummy : DependencyObject
{
public static readonly DependencyProperty ValuePr...
DependencyProperty.Register("Value", typeof(o...
}
}
}}
*トラブルシューティング [#ma2cdb51]
**ItemsSourceにバインディングしているのに表示されない。 [...
-例えばViewModeを以下のように定義し、MessagesをItemsSourc...
#pre{{
public LogWindowVM()
{
Messages = new ObservableCollection<string>();
Messages.Add("abc");
Messages.Add("def");
}
public ObservableCollection<string> Messages;
}}
-それはWPFのバインディングがプロパティに対して働くため。p...
-ということで。以下のようにする。
#pre{{
public LogWindowVM()
{
Messages = new ObservableCollection<string>();
Messages.Add("abc");
Messages.Add("def");
}
public ObservableCollection<string> Messages {get...
}}
ページ名: