[Windows Phone] Caliburn: 讓 ViewModel 使用不同的 View

使用 Caliburn 寫程 Windows Phone App,通常 ViewModel 與 View 是一對一的對應。但對於一些習慣寫網頁的人來說,會覺得 Model 應該要能對應到不同的 View,例如某些頁面,運作的邏輯是相同的,只是因為不同的客製化需求,而需要不同的介面。或者是說,利用 Attribute 來指定對應的 View,而不是透過預設的規則。

在 Caliburn中,是可以透過增加額外的規則來達到前述的目的。首先新增下列 Attribute:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
public class ViewAttribute : Attribute
{
    public object Context { get; set; }

    public Type ViewType { get; private set; }

    public ViewAttribute(Type viewType)
    {
        ViewType = viewType;
    }
}

ViewAttribute 是用來指定 ViewModel 所對應到的 View,而它的參數有 ViewType 及 Context,一般的情況下,指定 ViewType就可以了。

接下來在 App.cs 中的 Configure 方法,加入下列的程式碼:

var baseLocate = ViewLocator.LocateTypeForModelType;
ViewLocator.LocateTypeForModelType = (modelType, displayLocation, context) => {
    var attribute = modelType.GetTypeInfo().GetCustomAttributes(typeof(ViewAttribute), false).OfType<ViewAttribute>().FirstOrDefault();
    return attribute != null ? attribute.ViewType : baseLocate(modelType, displayLocation, context);
};

上面的程式碼,是檢查 ViewModel 是否有使用 ViewAttribute,如果有,就回傳指定的型別,如果沒有,就呼叫預設的 LocateTypeForModelType。當然也可以使用自己的設定檔來指定 View 與 ViewModel 對應的關係。

最後,在 ViewModel 套上 ViewAttribute 即可。

[View(typeof(ViewAttributePage2))]
public class ViewAttributePageViewModel : ViewModelBase
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s