這不是我以前試過的東西,但如果你看看Documentation,那就提到一個ViewModelBinder
類,它負責修復屬性,方法等各個綁定到它們各自的ViewModels
。
你的情況特別關注:
ViewModelBinder.BindActions是FUNC鍵,如果需要,從而可以完全取代 。通過 添加或更改ElementConventions,ConventionManager還將影響如何將行動放在一起。 更多關於下面。
因此,基本上,通過定義自己的BindActions
函數,應該有可能獲得您想要的行爲。
作爲一個開始的地方,您可以查看source的ViewModelBinder.BindActions
並查看當前如何定義函數。
如果你切出的WinRT的特定代碼,你留下的東西,看起來像這樣(你可能不得不刪除日誌調用):
ViewModelBinder.BindActions =
(namedElements, viewModelType) =>
{
var methods = viewModelType.GetMethods();
var unmatchedElements = namedElements.ToList();
foreach (var method in methods)
{
var foundControl = unmatchedElements.FindName(method.Name);
if (foundControl == null)
{
Log.Info("Action Convention Not Applied: No actionable element for {0}.", method.Name);
continue;
}
unmatchedElements.Remove(foundControl);
var message = method.Name;
var parameters = method.GetParameters();
if (parameters.Length > 0)
{
message += "(";
foreach (var parameter in parameters)
{
var paramName = parameter.Name;
var specialValue = "$" + paramName.ToLower();
if (MessageBinder.SpecialValues.ContainsKey(specialValue))
paramName = specialValue;
message += paramName + ",";
}
message = message.Remove(message.Length - 1, 1);
message += ")";
}
Log.Info("Action Convention Applied: Action {0} on element {1}.", method.Name, message);
Message.SetAttach(foundControl, message);
}
return unmatchedElements;
};
你可以看到Caliburn.Micro
嘗試通過將ViewModel
上的可用方法名稱與相應的View
中存在的控件的名稱進行比較來將該方法綁定到控件上。
一種方法可能是簡單地添加第二次嘗試找到控件,搜索附加的Button
的方法名稱。這似乎有點違反直覺(從名稱中刪除按鈕更合乎邏輯)。
if (foundControl == null)
{
// Check again for "<Method>Button" named FrameworkElements
foundControl = unmatchedElements.FindName(method.Name + "Button");
if (foundControl == null)
{
Log.Info("Action Convention Not Applied: No actionable element for {0}.", method.Name);
continue;
}
}
顯然,如果你有一個名爲SaveButton
和一個名爲Save
,其中只有一個是最後一次遇到會被正確連接了控制,這將意味着什麼。解決方案取決於您是否還想保留原始綁定行爲,或僅僅是這種新行爲。
無論是哪種情況,都值得閱讀整個文檔鏈接,因爲它提到了諸如ViewModelBinder.ApplyConventionsByDefault
標誌等其他感興趣的內容。