none
我想請問一個簡單的MVVM 概念問題 RRS feed

  • 問題

  • 小弟是昨天開始接觸MVVM這個概念 , 寫了一個鬧鐘如下

    現在有一個控制項名為 clock 它只有一個textblock, 負責顯示時間

    現在我把它放到windows(WPF)上, 但我要設定顯示3個不同的定時時間, 我把定時值存到

    Setting檔的 Property.Setting.Default.a  ,  b  , c 共3個變數

    問題是我如果在clock 裡以text 去 binding a , 這樣3個clock都只顯示a的值

    如果在windows做3個textblock去個別 binding a , b , c 又失去MVVM的意義

    請問我該怎樣做? 應該是在ViewModel的部分改寫 對吧? 但我又不知道該怎樣寫....

    感謝解答

    2010年9月2日 上午 09:42

解答

  • 上面所說的binding是透過XAML機制(或UI的cs檔案).

    譬如說
    GameView.XAML
    <UserControl x:Class="MVVM.Client.Views.GameView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:data="clr-namespace:MVVM.Client.Data;assembly=MVVM.Client.Data">

      <UserControl.Resources>
        <data:GamesViewModel x:Key="TheViewModel" />
      </UserControl.Resources>

      <Grid x:Name="LayoutRoot"
            DataContext="{Binding Path=Games, Source={StaticResource TheViewModel}}">
        ...
      </Grid>
    </UserControl>


    GamesViewModel.cs
    public class GamesViewModel
    {
      IGameCatalog theCatalog;
      ObservableCollection<Game> theGames = new ObservableCollection<Game>();

    ......
    }

    上面方式是透過static resource來結合xaml與viewmodel之間關係.是一般教學文件的作法.
    而大部分MVVM程式ViewModel與View之間的關聯都是透過IoC樣式來進行,目前微軟針對MVVM樣式有出了Prism Library可以使用.
    Prism介紹可參考我這篇文章,文章最下方的連結為一些不錯的教學文章
    http://www.dotblogs.com.tw/programlin/archive/2010/05/18/15302.aspx

    而如果使用Silverlight 4,IoC部分有新的做法,可以透過MEF組件來進行,但這部分屬於比較新的方式,文件並不多,不過已熟悉IoC的人應該很容易就了解.
    而Prism下版將會密切與MEF有關.

     

    • 已提議為解答 傑德 2010年9月9日 上午 04:00
    • 已標示為解答 godsing 2010年9月14日 上午 02:34
    2010年9月9日 上午 02:30
  • 您的binding語法是怎麼下的?

    Uniform Grid是要分別binding Row跟Cell的,不能直接丟一個list給它

    通常我會再建立一個Cell類別,用來記錄X軸跟Y軸,就像是一個二維陣列一樣,例如: Cell[0,1].Value = SomeValueYouAssigned

     

     

    • 已標示為解答 godsing 2010年9月14日 上午 02:34
    2010年9月8日 上午 05:25

所有回覆

  • 其實MVVM的概念很簡單大致上跟MVC,MVP相同,唯一的差別就是UI與Model間的溝通是靠Bind機制來運作,也就是UI的所有資料來源或事件(在WPF中是透過Command)透過ViewModel這層程式作Bind,而 ViewModel有點像MVC中的Control但不會直接對View作動作.

    你的問題處理方式為建立一個ViewModel類別然後在ViewModel中設定三個屬性(需實作WPF的Notification機制),然後將三個TextBlock Bind到這三個屬性.而ViewModel類別負責由setting檔去取值給這三個變數.

    2010年9月3日 上午 06:56
  • class alarm_ViuewModel : ViewModelEntity
        {
            private ObservableCollection<alarm_clock> alarm_list;

            private alarm_clock alarm_1;
            private alarm_clock alarm_2;
            private alarm_clock alarm_3;

            public ObservableCollection<alarm_clock> Alarm_list
            {
                get
                {
                    return alarm_list;
                }
                set
                {
                    alarm_list = value;
                    NotifyPropertyChange("Alarm_list");
                }
            }

            public alarm_clock Alarm_1
            {
                get
                {
                    return alarm_1;
                }
                set
                {
                    alarm_1 = value;
                    NotifyPropertyChange("Alarm_1");
                }
            }
            public alarm_clock Alarm_2
            {
                get
                {
                    return alarm_2;
                }
                set
                {
                    alarm_2 = value;
                    NotifyPropertyChange("Alarm_2");
                }
            }
            public alarm_clock Alarm_3
            {
                get
                {
                    return alarm_3;
                }
                set
                {
                    alarm_3 = value;
                    NotifyPropertyChange("Alarm_3");
                }
            }

            public alarm_ViuewModel()
            {
                alarm_list = new ObservableCollection<alarm_clock>();
                alarm_1 = new alarm_clock();
                alarm_2 = new alarm_clock();
                alarm_3 = new alarm_clock();

                alarm_1.alarm_time.Text = Properties.Setting.Default.alarmClock_1.ToString();
                alarm_2.alarm_time.Text = Properties.Setting.Default.alarmClock_2.ToString();
                alarm_3.alarm_time.Text = Properties.Setting.Default.alarmClock_3.ToString();

                Alarm_list.Add(Alarm_1);
                Alarm_list.Add(Alarm_2);
                Alarm_list.Add(Alarm_3);
            }
        }

    這是我目前的ViewModel 實體三個控制項alarm_1 ,2, 3

    我把它放到ObservableCollection<alarm>裡都沒問題

    如果跟listbox Binding是會顯示內容

    但我想讓它跟UniformGrid Binding讓它們3個排在裡面

    但我datacontext去binding 卻沒有東西...

    我甚至把ObservableCollection<> 改成 UIElement[] 與 UniformGrid 類別去add也沒有

    到底要怎樣做才好

    感謝解答

    2010年9月3日 上午 11:33
  • 您的binding語法是怎麼下的?

    Uniform Grid是要分別binding Row跟Cell的,不能直接丟一個list給它

    通常我會再建立一個Cell類別,用來記錄X軸跟Y軸,就像是一個二維陣列一樣,例如: Cell[0,1].Value = SomeValueYouAssigned

     

     

    • 已標示為解答 godsing 2010年9月14日 上午 02:34
    2010年9月8日 上午 05:25
  • 感謝回答 (抱歉昨天生病 ... 沒有回覆)

    所以意思是我要建一個陣列 , 把實體的物件放進去

    再依順序binding給Rows 或是 Columns 這樣嗎 @@ (但是如果是一維, 那uniformGrid 不是會自己排序嗎 ?)

    那假設我用陣列 , 我指定[0] , [1]等位置給一個屬性去存 , 在binding給Rows 這樣對嗎?

     

    感謝解答 

     

    2010年9月9日 上午 02:16
  • 上面所說的binding是透過XAML機制(或UI的cs檔案).

    譬如說
    GameView.XAML
    <UserControl x:Class="MVVM.Client.Views.GameView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:data="clr-namespace:MVVM.Client.Data;assembly=MVVM.Client.Data">

      <UserControl.Resources>
        <data:GamesViewModel x:Key="TheViewModel" />
      </UserControl.Resources>

      <Grid x:Name="LayoutRoot"
            DataContext="{Binding Path=Games, Source={StaticResource TheViewModel}}">
        ...
      </Grid>
    </UserControl>


    GamesViewModel.cs
    public class GamesViewModel
    {
      IGameCatalog theCatalog;
      ObservableCollection<Game> theGames = new ObservableCollection<Game>();

    ......
    }

    上面方式是透過static resource來結合xaml與viewmodel之間關係.是一般教學文件的作法.
    而大部分MVVM程式ViewModel與View之間的關聯都是透過IoC樣式來進行,目前微軟針對MVVM樣式有出了Prism Library可以使用.
    Prism介紹可參考我這篇文章,文章最下方的連結為一些不錯的教學文章
    http://www.dotblogs.com.tw/programlin/archive/2010/05/18/15302.aspx

    而如果使用Silverlight 4,IoC部分有新的做法,可以透過MEF組件來進行,但這部分屬於比較新的方式,文件並不多,不過已熟悉IoC的人應該很容易就了解.
    而Prism下版將會密切與MEF有關.

     

    • 已提議為解答 傑德 2010年9月9日 上午 04:00
    • 已標示為解答 godsing 2010年9月14日 上午 02:34
    2010年9月9日 上午 02:30
  • 感謝

    以了解 , 多謝指導

    2012年4月13日 上午 01:27