WPF新建viewModel例項化成員的注意事項

ggtc發表於2024-04-13

不要用表示式體去初始化一個用做資料來源(比如ItemSource)的引用型別成員。比如這種

public List<MainWindowItem> Items => new List<MainWindowItem>()
{
    new MainWindowItem{title="專案管理",icon="\ue613",type=typeof(專案管理Control),group="內部管理"},
    new MainWindowItem{title="人力資源管理",icon="\ue828",type=typeof(人力資源管理Control),group="內部管理"},
    new MainWindowItem{title="部門管理",icon="\ue7cf",type=typeof(部門管理Control),group="內部管理"},
    new MainWindowItem{ title = "專案參與人員管理",icon="\ue608", type = typeof(專案參與人員管理Control), group = "其他管理" },
};

因為每次表示式體實際上是一個語法糖,被翻譯成了一個只讀屬性

public List<MainWindowItem> Items { 
    get {
        return new List<MainWindowItem>()
        {
            new MainWindowItem{title="專案管理",icon="\ue613",type=typeof(專案管理Control),group="內部管理"},
            new MainWindowItem{title="人力資源管理",icon="\ue828",type=typeof(人力資源管理Control),group="內部管理"},
            new MainWindowItem{title="部門管理",icon="\ue7cf",type=typeof(部門管理Control),group="內部管理"},
            new MainWindowItem{ title = "專案參與人員管理",icon="\ue608", type = typeof(專案參與人員管理Control), group = "其他管理" },
        };
    } 
}

導致每次訪問這個屬性時,都會重新new一個物件。這個物件和原來繫結到介面的物件不是同一個物件,某些情況下會出現意料之外的結果。

相關文章