我想請問一個簡單的MVVM 概念問題
-
2010年9月2日 上午 09:42
小弟是昨天開始接觸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月3日 上午 06:56
其實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日 上午 11:33
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月8日 上午 05:25
您的binding語法是怎麼下的?
Uniform Grid是要分別binding Row跟Cell的,不能直接丟一個list給它
通常我會再建立一個Cell類別,用來記錄X軸跟Y軸,就像是一個二維陣列一樣,例如: Cell[0,1].Value = SomeValueYouAssigned
- 已標示為解答 godsing 2010年9月14日 上午 02:34
-
2010年9月9日 上午 02:16
感謝回答 (抱歉昨天生病 ... 沒有回覆)
所以意思是我要建一個陣列 , 把實體的物件放進去
再依順序binding給Rows 或是 Columns 這樣嗎 @@ (但是如果是一維, 那uniformGrid 不是會自己排序嗎 ?)
那假設我用陣列 , 我指定[0] , [1]等位置給一個屬性去存 , 在binding給Rows 這樣對嗎?
感謝解答
-
2010年9月9日 上午 02:30
上面所說的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有關. -
2012年4月13日 上午 01:27
感謝
以了解 , 多謝指導

