不使用DataContext直接将ViewModels绑定到ItemsControl控件

在常规的MVVM设计模式中,都是通过DataContext将ViewModels的一个对象绑定到View的DataContext中,从而完成相应地绑定,在本文中我们将通过另外的一种思路来将ViewModels的一个对象绑定到View的DataContext中。

首先 ,在ViewModel中定义一个该类的静态实例。 

private static TaskManager _instance;

        public static TaskManager Instance
{
get
{
if (_instance != null)
{
return _instance;
}
else
{
_instance = new TaskManager();
return _instance;
}
}
set
{
if (value != _instance)
{
_instance = value;
}
}
}
private ObservableCollection<TaskThread> _TaskPools =
new ObservableCollection<TaskThread>(); public ObservableCollection<TaskThread> TaskPools
{
get { return _TaskPools; }
set
{
if (value != _TaskPools)
{
_TaskPools = value;
OnPropertyChanged("TaskPools");
}
}
}  
 然后看一下该ViewModel的构造函数 
public class TaskManager:Microsoft.Practices.Prism.Mvvm.BindableBase
{
public TaskManager()
{ for (int i = 0; i < 10; i++)
{
TaskInfo info = new TaskInfo()
{
CurrentMessage="123",
Discription="456",
Name="Hello "+i.ToString(),
Progress=i,
IsCanceled=true,
IsFaulted=true,
IsCompleted=true,
IsInterminate=false
};
Guid guid = Guid.NewGuid();
TaskPools.Add(new TaskThread(guid,info));
}
Instance = this;
}
}  

  再看一下前台的内容,比如我们要把当前的Instance绑定到一个ItemsControl的ItemsSource属性,那么我们需要进行以下步骤:

a  首先定义ViewModel所在的类的命名空间,xmlns:vm="clr-namespace:TestDemo.ViewModels"

b   然后再给ItemsControl 绑定数据源 <ItemsControl ItemsSource="{Binding Source={x:Static vm:TaskManager.Instance},Path=TaskPools}">,这里需要注意的是要使用x:Static关键字来进行说明,那么现在来说一下x:Static来引用一个类的对象,x:Static引用的代码实体必须是下面的某一项:1 常数 2 静态属性 3 字段 4 一个枚举值,在本例中引用的是静态属性,x:Static扩展用来把某个对象中的属性或域的值赋给目标对象的相关属性,下面举出另外一种方法:

<TextBlock Name="exText" Background="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}" Height="30" FontSize="24" ></TextBlock>

  {x:Static SystemColors.ActiveCaptionBrushKey}静态扩展取得ActiveCaptionBrush的值。

上一篇:PHP 类与对象 全解析( 二)


下一篇:统计s="hello alex alex hello haiyan cc haiyan com"中每个单词的个数