我希望获得对绑定到给定属性名称的TextBox
的引用。
我想在不改变视图的情况下这样做。
使用Caliburn Micro有没有正确的方法?
如果没有,那么什么是足够好的"方式是什么?
public class MweViewModel : PropertyChangedBase
{
public MweViewModel() : base()
{
PropertyChanged += (object sender, PropertyChangedEventArgs e) =>
{
// Find control (i.e. TextBox) bound to property with name e.PropertyName
TextBox textBox = ...
};
}
}
答案 0 :(得分:1)
我不一定确定这是最明智的方法(这不是我自己试图做的事情),看Documentation,提到一个ViewModelBinder
类是负责任的用于修复属性,方法等的各种绑定到它们各自的ViewModels
。
BindProperties
上的ViewModelBinder
函数负责解析属性与最终绑定的UI元素之间的绑定。您可以根据现有代码定义自己的函数,该代码跟踪正在建立的所有绑定,因此您可以记录它们可以在程序中的其他位置使用。
使用existing code会给你这样的东西:
ViewModelBinder.BindProperties = (namedElements, viewModelType) =>
{
var unmatchedElements = new List<FrameworkElement>();
foreach (var element in namedElements)
{
var cleanName = element.Name.Trim('_');
var parts = cleanName.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
var property = viewModelType.GetPropertyCaseInsensitive(parts[0]);
var interpretedViewModelType = viewModelType;
for (int i = 1; i < parts.Length && property != null; i++)
{
interpretedViewModelType = property.PropertyType;
property = interpretedViewModelType.GetPropertyCaseInsensitive(parts[i]);
}
if (property == null)
{
unmatchedElements.Add(element);
// Log.Info("Binding Convention Not Applied: Element {0} did not match a property.", element.Name);
continue;
}
var convention = ConventionManager.GetElementConvention(element.GetType());
if (convention == null)
{
unmatchedElements.Add(element);
// Log.Warn("Binding Convention Not Applied: No conventions configured for {0}.", element.GetType());
continue;
}
var applied = convention.ApplyBinding(
interpretedViewModelType,
cleanName.Replace('_', '.'),
property,
element,
convention
);
if (applied)
{
// Log.Info("Binding Convention Applied: Element {0}.", element.Name);
}
else
{
// Log.Info("Binding Convention Not Applied: Element {0} has existing binding.", element.Name);
unmatchedElements.Add(element);
}
}
return unmatchedElements;
};
在添加绑定时(设置applied
时),您将获得所需的所有信息。然后,您可以存储特定绑定(例如与TextBox
相关的绑定)。
您可能会使用类似静态字典的内容(根据您的要求,可能会有更合适的内容):
ViewModel Type Bound Property List of Bound elements
| | |
| | |
Dictionary<Type, Dictionary<PropertyInfo, List<FrameworkElement>>>
您必须注意空/健全性检查。
还有一些其他解决方案使用辅助方法来获取绑定的属性/控件,尽管它们通常必须遍历可视化树,这样,您就是在实际创建绑定时执行它。