WPF(MVVM)中 工具窗口绑定主窗口ViewModle,

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_38131614/article/details/77867073

两个View 绑定一个ViewModle.

这样工具箱中的就不用在次实现,

我是在主窗口中开起的工具箱,软件一起到就开始,工具箱.xaml.cs

 public partial class MyToolBar : Window
    {
        private DispatcherTimer timer;
    
        //通过传参两窗口同时绑定一个ViewMode
        public MyToolBar( MainPageViewModel md)
        {
            
            InitializeComponent();
            Loaded += new RoutedEventHandler(ToolBar_Loaded);
            this.DataContext = md;

        }


        /// <summary>
        /// 工具箱永远置顶
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void ToolBar_Loaded(object sender, RoutedEventArgs e)
        {
            //定时器
            timer = new DispatcherTimer();
            //1秒触发一次定时器
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer1_Tick;
            timer.Start();

            //....

            //timer.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //定时处理

            this.Topmost = true;
        }
定时器定时新,使工具窗口一直在最前

在主窗口ViewModle中

///工具栏
        ///提升为公有方法,给热键(T)使用
        /// </summary>
        public  void ToolBarExecute(Window window)
        {
            if (toolbar == null)
            {
                toolflag = 1;
                //传参绑定
                toolbar = new MyToolBar( this);
                //固定窗口位置
                toolbar.WindowStartupLocation = WindowStartupLocation.Manual;
                toolbar.Left = 0;
                toolbar.Top = 80;
                toolbar.Owner = window;
                toolbar.Show();
                win.Add(toolbar);
            }
            else if(toolbar !=null )
            {
                //再次点击关闭窗口
                toolbar.Close();
                toolbar = null;
                toolflag = 0;
                win.Remove(toolbar);
            }


        }
这样 工具箱中的按件就能与主窗口一样了

当然还能增加一些自己的功能。

展开阅读全文

WPF MVVM 清除绑定

07-01

WPF板块:rnrn老哥们 ,我遇到一个情况,就是当界面里一个图片绑定了BitmapImage 属性源的情况下,无法释放内存。是一个大项目中的一个问题,我整理了一下,下面用一个简单的示例演示:rnrn界面绑定了一个图片:rn[code=html]rnrn rn rn rnrn[/code]rnrn这个图片绑定的属性源:rn[code=csharp]rn private BitmapImage imageSource1;rnrn public BitmapImage ImageSource1rn rn getrn rn return imageSource1;rn rn setrn rn imageSource1 = value;rn if (null != PropertyChanged)rn rn PropertyChanged.Invoke(this, new PropertyChangedEventArgs("ImageSource1"));rn rn rn rn[/code]rnrn为了演示内存没被释放 ,用一个在MainWindow上的按钮来弹出上面的Window1界面:rn[code=html]rnrn rn rn rnrn[/code]rnrn[code=csharp]rn private void button_Click(object sender, RoutedEventArgs e)rn rnrn BitmapImage imageSource1 = new BitmapImage();rn imageSource1.BeginInit();rn imageSource1.CacheOption = BitmapCacheOption.OnLoad;rn imageSource1.StreamSource = new MemoryStream(File.ReadAllBytes("TestImage.png"));rn imageSource1.EndInit();rnrn Window1 w1 = new Window1();rn w1.ImageSource1 = imageSource1;rn w1.ShowDialog();rnrn //BindingOperations.ClearBinding(w1.image, System.Windows.Controls.Image.SourceProperty);rnrn rn[/code]rnrn在没关闭Window1界面的时候,内存里是有 Window1 这个实例的:rn[img=https://img-bbs.csdn.net/upload/201807/01/1530418552_514357.png][/img]rnrn当我关闭Window1界面的时候,内存里是还是有 Window1 这个实例的,显然Window1 没被释放掉:rn[img=https://img-bbs.csdn.net/upload/201807/01/1530418730_110676.png][/img]rnrn找了很久,发现原来是图片一直占用着绑定资源,直到我手动加上最后一句:rnrn[code=csharp]rn private void button_Click(object sender, RoutedEventArgs e)rn rnrn BitmapImage imageSource1 = new BitmapImage();rn imageSource1.BeginInit();rn imageSource1.CacheOption = BitmapCacheOption.OnLoad;rn imageSource1.StreamSource = new MemoryStream(File.ReadAllBytes("TestImage.png"));rn imageSource1.EndInit();rnrn Window1 w1 = new Window1();rn w1.ImageSource1 = imageSource1;rn w1.ShowDialog();rnrn BindingOperations.ClearBinding(w1.image, System.Windows.Controls.Image.SourceProperty);rnrn rn[/code]rnrn内存就被释放掉了:rnrn但是用这句就不能释放,存留疑问:rn[code=csharp]rnBindingOperations.ClearAllBindings(w1);rn[/code]rnrn有人说换图片数据源,不要这么赋值,我也试过了,从一个文件直接绑定图片,是可以释放掉的,但是项目里是从硬件里copy过来byte[]转换成的图片, 上面的只是我为了演示,暂时从图片文件里获取。rnrn最后,我就是想知道有没有其它方法能够释放掉上面的图片绑定,我不想给界面控件赋上一个x:Name="xxx" ,然后再用下面的方式去解绑BindingOperations.ClearBinding([color=#FF0000]w1.xxx[/color], System.Windows.Controls.Image.SourceProperty)rnrn显然不符MVVM的风格,ViewModel里还有各种页面控件,看起来就很乱,有没有其它能从属性源头解绑的方式?或者其它更好的解绑做法?rnrn谢谢 老哥们了~ 论坛

WPF MVVM模式中的DataGrid绑定问题!

05-05

1,问题:rn在ViewModel中通过重新从数据库获取集合赋值到ViewModel集合 前台不更新!!!!!rn-->一个window:含有一个DataGrid,DataContex已经绑定好对应的ViewModelrn-->另一个window:输入一个员工的信息添加到数据库rn-->一个Model:员工各种属性rn-->一个ViewModel:含有一个Model的集合,类型为Observerbal<>,以MVVM属性方式定义,已经继承ViewModelBasern2,部分代码:rnrnrn(viewmodel)rn[code=csharp]rnpublic class EmployeeManageViewModel:ViewModelBasern rn private ObservableCollection employeeModelList;rn public ObservableCollection EmployeeModelListrn rn get return employeeModelList; rn setrn rn employeeModelList = value;rn RaisePropertyChanged("EmployeeModelList");rn rn rn public EmployeeBLL employeeBLL = new EmployeeBLL();//获取员工列表BLL(从数据库)rn public EmployeeManageViewModel()rn rn MsgHelper.RefreshDataGridEvent += MsgHelper_RefreshDataGridEvent;//更新list事件rn if (IsInDesignMode)rn rnrn rn elsern rn employeeModelList = employeeBLL.GetEmployees();//从数据库获取集合rn rn rnrn private void MsgHelper_RefreshDataGridEvent()rn rn employeeModelList = employeeBLL.GetEmployees();//从数据库 再 获取一次赋值给集合rn rn rn[/code]rnrnrn另一个窗口添加一个员工(部分代码)rn[code=csharp]rnemployeeBLL.InsertEmployee(employeeInfo.employeeModel);//插入数据库rnMsgHelper.RefreshDataGrid();//委托更新listrn[/code]rnrnrn委托传递类rn[code=csharp]rnpublic delegate void ShowMainMenuHandle();rn public delegate void RefreshDataGridHandle();rn public static class MsgHelperrn rn public static event RefreshDataGridHandle RefreshDataGridEvent;rn public static void RefreshDataGrid()rn rn RefreshDataGridEvent();rn rn rn[/code]rnrnrn过程描述:rn输入一个员工信息rn点击保存rn更新数据库rn委托更新另一个窗口的ViewModel(那个集合)rn[b]可是,发现并不能更新............并且employeeModelList.Add(new EmployeeXXXXXX)可以加一个数据并更新,重新赋值不能更新!![/b]rn求解答 论坛

WPF中用MVVM绑定ContentControl界面无变化

04-21

在WPF中使用MVVM绑定ContentControl,调试的时候Query和Refund方法都是进的去的,问题就在rn ViewModel = _vMQueryPayListCtrl这些东西都无效,界面没有变化,仔细对比了别人的demo,也没找到问题。rnVMMainWindow中继承了INotifyPropertyChanged,由于代码较多,只贴了主要部分代码。rnxaml部分rn[code=csharp] rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn[/code]rnrn[code=csharp] rn rn rn rn rn rn rn rn rn rn rn rn rn rn[/code]rnrnVM部分rn[code=csharp] rn private readonly VMNumberArea _vMNumberArea = new VMNumberArea();rn private readonly VMQueryPayListCtrl _vMQueryPayListCtrl = new VMQueryPayListCtrl();rn private readonly VMRefundCtrl _vMRefundCtrl = new VMRefundCtrl();rn private object _viewModel;rnrn public object ViewModelrn rn get return _viewModel; rn setrn rn if (_viewModel == value)rn rn return;rn rn _viewModel = value;rn OnPropertyChanged("ViewModel");rn rn rn public DelegateCommand TextBlockCommand get; set; rnrn public VMMainWindow()rn rn this.TextBlockCommand = new DelegateCommand();rn this.TextBlockCommand.ExecuteAction = new Action(ShowTextBlock);rn rnrn private void ShowTextBlock(object obj)rn rn switch (obj.ToString())rn rn case "收款":rn Receivables();rn break;rn case "退款":rn Refund();rn break;rn case "查询":rn Query();rn break;rn case "统计":rn Statistics();rn break;rn case "解绑":rn Untying();rn break;rn case "设置":rn Setup();rn break;rn case "账户":rn Account();rn break;rn case "退出":rn default:rn Closed?.Invoke();rn break;rn rn rn private void Query()rn rn Height = new GridLength(0);rn Wheight = 475;rn ViewModel = _vMQueryPayListCtrl;rn rnrn private void Refund()rn rn ViewModel = new VMRefundCtrl();rn rn[/code] 论坛

没有更多推荐了,返回首页