zoukankan      html  css  js  c++  java
  • 不使用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的值。

  • 相关阅读:
    Android Studio的git功能的使用介绍
    如何用Android Studio同时使用SVN和Git管理项目
    【.NET深呼吸】动态类型(扩充篇)
    【.net深呼吸】动态类型(高级篇)
    【.net深呼吸】动态类型(娱乐篇)
    VS 2015相当不错的功能:C#交互窗口
    计算照片的面积(WPF篇)
    计算照片的面积(UWP篇)
    【Win 10应用开发】把文件嵌入到XML文档
    【.NET深呼吸】基础:自定义类型转换
  • 原文地址:https://www.cnblogs.com/seekdream/p/5051266.html
Copyright © 2011-2022 走看看