none
請問如何把一個共用的數據, 傳給其他class 使用, 哪一種方式適合?? RRS feed

  • 問題

  • 小弟的情況是這樣的

    有一個主畫面, 上面有兩個子畫面分別是代表部門與業績

    進到主畫面後先輸入身分, 假設就名字就好

    這組"名字"

    1. 存到一個Model 裡面之後 , 那請問另外兩個子畫面要如何得到該Model?

    2. 直接以事件夾帶名字參數過去給2個子畫面並顯示(目前採用這個)

    3.存到Setting設定檔, 再給子畫面去抓設定檔的值

    4.建立靜態Model可行嗎?

    5.其他好辦法?

    請問版上的鄉民, 哪一種方法會比較適合?? 或是有其他方法??

    ============================================================

    題外話 prism v4.0的Services跟ServiceLocator 有什麼差異?? 是一樣的東西嗎?

    因為搜尋"服務"與"Services" 都找到很多不相干的東西...

    Services是做什麼的?

    ServiceLocator 是將除了ContentControl與ItemsControl之外的其他控制項也註冊為Region 是嗎??

    因為自己也是看英文版的, 很怕誤解它的意思...

     

    感謝解答以上問題

    2011年3月5日 上午 11:31

解答

  • 擷取重點部分的範例如下
    假設畫面上有兩個View,分別為MainView,SubView,而SubView是註冊於MainView中的Region中,而註冊方式這邊就省略了,使用Unity與MEF有些差異但對於運作沒影響.

    MainView.xaml
    ....
       <ContentControl
            HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
            prism:RegionManager.RegionName="SubView_Region"
            prism:RegionManager.RegionContext="{Binding Data}" <<這邊的Data就是MainView要傳遞給SubView的資料,故須於MainView的ViewModel宣告
       />

    SubView.cs
    ....
            [Import]
            public SubViewModel ViewModel
            {
                set { this.DataContext = value; }
                get { return (SubViewModel)this.DataContext; }
            }

            public SubView()
            {
                InitializeComponent();

                RegionContext.GetObservableContext(this).PropertyChanged +=
                    (s, e) =>
                    {
                        obejct data = RegionContext.GetObservableContext(this).Value;
                        this.ViewModel.Data = data;
                    };
            }
    必較特別的在此SubView.cs,因為要取得上層透過RegionContext提供的資料必須透過Prism的RegionContext.GetObservableContext函數,但由於RegionContext.GetObservableContext必須提供此UI(UserControl)的instance,故無法將此段寫於SubView的ViewModel中而必須透過SubView傳遞給其ViewModel.

    2011年3月9日 上午 01:26

所有回覆

  • 也可以利用Model類別建立物件, 再將物件傳遞給其他的子畫面使用
    2011年3月5日 下午 12:41
  • 承上, 你可以利用 自訂屬性 (Property).
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月5日 下午 01:47
    版主
  • Hi,

    如果傳遞物件參考的動作太頻繁

    可以考慮使用Singleton設計模式

    設計一個GlobalSetting的類別

    透過Singleton讓所有物件都能存取到GlobalSetting物件的資料


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2011年3月7日 上午 03:16
  • 如果你是問Prism設計,有幾種方式
    1.透過Event.
    2.透過RegionContext.
    3.透過Service

    三者的差異為
    Event顧名思義它的目的是不同View中的通訊機制,當然以你的例子你可以透過Event來傳遞資料,但Event主要的目的還是在於不同View中脫偶的通訊機制而非用來傳遞資料,譬如說當View1更新了某項資料而View2也需要做變動時,透過Event可以達成兩者並不需要互相參照,記得Event的目的是用來傳遞變動而不是用來傳遞資料.

    RegionContext的目的在於當View中包含子View,View需要傳遞給子View資料時使用,透過RegionContext可以直接在parent view中直接指定children view的datacontext屬性為特定資料.而這應該比較符合你的需求

    Services指得是服務,ServiceLocator是Prism中的一個實作方式,簡單來說就是把存取資料的程式放於service中,這樣可以避免某些邏輯散布於各程式碼中導致事後修改困難,你的例子中你可以設計一個Service然後透過單例樣式將資料共存於一個地方,如此就能在不同view中存取到相同資料,但這不是好做法,service的目的在於統一商業邏輯避免重複的程式碼分散於很多地方.(這部分其實有點籠統,這邊只是一個概略的說法,因為這部分包含的東西太多).

    2011年3月7日 上午 07:16
  • 非常感謝

    請問 Region Context 是如何運作??? 我有找到以下例子, 不過沒頭沒尾的感覺....

    http://www.cnblogs.com/Mainz/archive/2011/03/01/1967841.html

    請問可以舉個簡單的例子或sample嗎?

    非常感謝

    2011年3月7日 下午 02:17
  • 你可以參考兩處

    1.Prism的說明文件有詳細說明RegionContext的目的與用法,學習Prism最好把說明文件詳細看過一遍因為目前資源並不多,此說明文件算是目前最好的文件
    2.另外你也可以參考Prism的Sample code在安裝目錄下的Quickstarts\UIComposition這個專案,其中的EmployeeModule\Views\EmployeeSummaryView.xaml中有用到RegionContext.

     

    2011年3月8日 上午 02:39
  • 以下是程式碼

      public partial class Main : UserControl
      {
        private IRegionManager _regionManager;
        private IUnityContainer _container;
    
        public ViewModels.Main_VM ViewModel { get; set; }
    
        public Main(IUnityContainer container, IRegionManager regionManager)
        {
          InitializeComponent();
    
          this.Loaded += new RoutedEventHandler(main_Loaded);
          _container = container;
          _regionManager = regionManager;
        }
    
        void main_Loaded(object sender, RoutedEventArgs e)
        {
          this.DataContext = _container.Resolve<ViewModels.Main_VM>();
          ViewModel = this.DataContext as ViewModels.Main_VM;
    
          ObservableRegionContext.Value = ViewModel;
        }
    
        public ObservableObject<object> ObservableRegionContext
        {
          get { return RegionContext.GetObservableContext(this); }
        }
      
    

    小弟我取得了Main的Datacontext了, 那請問我該怎樣傳給其他sub View??

    因為我是用巡覽的方式換sub View

    請問我這個ObservableRegionContext 要如何把值傳給其他View??

    (這方面資料真的很少...)

    2011年3月8日 上午 07:23
  • 上面提供的範例你有看嗎??
    範例中有很明確的Sample可供參考,你試看看.

    另外prism 4有兩種模式作為架構,一個是向下相容的Ioc模式使用Enterprise Library的Unity Framework,也就是你上面用的IUnityContainer.而這是prism 2就存在的
    而另一個是目前SL 4推出的MEF框架,透過Attribute方式來註冊View於region.如果你是用SL 4建議你使用MEF機制會解決很多View注入Region的問題.
    而大部分網路上可取得的資訊還是基於prism 2,尤其是中文,很少MEF部分.

    強烈建議你在開始使用prism 4前先把他的說明文件看過並了解其作法,會對寫程式很有幫助.
    另外使用prism 4前請先了解MVVM的定義,你上面的程式很明顯的並未真正理解MVVM的作法.
    因為ObservableRegionContext不應該出現在View中.

     

    2011年3月8日 上午 08:02
  • 感謝回答

    小弟不是沒有看範例, 實在是因為那個silverlight的範例執行後一直卡在一開始的100% 就停了....

    只好自己看程式碼再來想像...

    把ObservableRegionContext寫在View是看他範例寫的, 不過他好像是做更新事件, 我弄錯了, 感謝解答

    可以請教一下MEF的上要怎樣解決這個問題?? 因為英文PDF檔上面好像沒有... 還是我漏看了.....?

    其實本來是要做MEF的, 但是想說從簡單的先開始....

     

    目前我MEF的用法都在是引入DLL, 沒有用在引入Module上 , 小弟是參考下面網址

    http://www.codeproject.com/info/search.aspx?artkw=First+Guide+to+MEF+and+Silverlight&sbo=kw

    2011年3月9日 上午 01:10
  • 擷取重點部分的範例如下
    假設畫面上有兩個View,分別為MainView,SubView,而SubView是註冊於MainView中的Region中,而註冊方式這邊就省略了,使用Unity與MEF有些差異但對於運作沒影響.

    MainView.xaml
    ....
       <ContentControl
            HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
            prism:RegionManager.RegionName="SubView_Region"
            prism:RegionManager.RegionContext="{Binding Data}" <<這邊的Data就是MainView要傳遞給SubView的資料,故須於MainView的ViewModel宣告
       />

    SubView.cs
    ....
            [Import]
            public SubViewModel ViewModel
            {
                set { this.DataContext = value; }
                get { return (SubViewModel)this.DataContext; }
            }

            public SubView()
            {
                InitializeComponent();

                RegionContext.GetObservableContext(this).PropertyChanged +=
                    (s, e) =>
                    {
                        obejct data = RegionContext.GetObservableContext(this).Value;
                        this.ViewModel.Data = data;
                    };
            }
    必較特別的在此SubView.cs,因為要取得上層透過RegionContext提供的資料必須透過Prism的RegionContext.GetObservableContext函數,但由於RegionContext.GetObservableContext必須提供此UI(UserControl)的instance,故無法將此段寫於SubView的ViewModel中而必須透過SubView傳遞給其ViewModel.

    2011年3月9日 上午 01:26
  • 感謝指導

    小弟做了一個sample  http://www.megaupload.com/?d=HD3I9VVA

    大致上就是MainView 包了 一個SubView

    用MEF 去引入Module

    按下MainView的鍵 , 就改變文字 , 使用同一個Model 的SubView也連帶改變

    Sub也按下鍵去改變Model 內的值並影響MainView的值

    希望有經驗的鄉民有時間可以並指正

    有興趣的相民也可以看看

    感謝各位的觀賞與解答

    2011年3月9日 上午 08:21
  • 初步看了一下你的程式,問題很多.......
    不單單只是RegionContext,region的注入方式與MVVM的用法都不正確....
    等有空時寫個範例提供給參考.
    2011年3月9日 上午 09:23