完善主體資料,免費贈送VIP會員!
      * 主體類型
      * 企業名稱
      * 信用代碼
      * 所在行業
      * 企業規模
      * 所在職位
      * 姓名
      * 所在行業
      * 學歷
      * 工作性質
      請先選擇行業
      您還可以選擇以下福利:
      行業福利,領完即止!

      下載app免費領取會員

      NULL

      ad.jpg

      二次開發教程:WPF DataContent內存釋放問題

      發布于:2019-07-25 15:06:21

      網友投稿

      更多

      最近發現一個有趣的事,通過Window.dataContent來設置綁定以后,


      窗體關閉以后 ViewModel 并沒有釋放,再次調用改窗體后,前一個ViewModel才釋放,


      或者是程序關閉以后才釋放 ,搞不懂。。。


      如果要馬上釋放ViewModel可以在Window關閉以后將DataContent 設置為null ,


      這樣ViewModel是可以釋放的


      下面是測試代碼,大神請指教!




      主窗體:


      <Window x:Class="WeakViewModel.MainWindow"

              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

              xmlns:local="clr-namespace:WeakViewModel"

              mc:Ignorable="d"

              Title="MainWindow" Height="350" Width="525">

          <Grid>

              <Button Content="Win1"  HorizontalAlignment="Left" Margin="367,211,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>

              <Button Content="GC" HorizontalAlignment="Left" Margin="128,211,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>

          </Grid>

      </Window>


          public partial class MainWindow : Window

          {

              public MainWindow()

              {

                  InitializeComponent();

              }


              private void Button_Click(object sender, RoutedEventArgs e)

              {

                  TestWindow win = new TestWindow();

                  win.Owner = this;

                  win.DataContext = ViewModel.Default;

                  win.Show();

              }


              private void Button_Click_1(object sender, RoutedEventArgs e)

              {            

                  GC.Collect();

              }

          }




      測試窗體:


      <Window x:Class="WeakViewModel.TestWindow"

              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

              xmlns:local="clr-namespace:WeakViewModel"

              mc:Ignorable="d"        

              Title="TestWindow" Height="300" Width="300">

          <Grid>

              <TextBox HorizontalAlignment="Left" Height="23" Margin="96,111,0,0" TextWrapping="Wrap" Text="{Binding Path=Text}" VerticalAlignment="Top" Width="120"/>

          </Grid>

      </Window>


          public partial class TestWindow : Window

          {

              public TestWindow()

              {

                  InitializeComponent();

                  Closed += TestWindow_Closed;

              }

              ~ TestWindow()

              {

                  MessageBox.Show("釋放TestWindow");

              }

              private void TestWindow_Closed(object sender, EventArgs e)

              {


                  //注釋這個行就能看出差別


                  DataContext = null;

              }

          }




      測試ViewModel:


          public class ViewModel

          {

              private static WeakReference _default = null;

              private static object locker = new object();

              public static ViewModel Default

              {

                  get

                  {

                      if(_default==null||!_default.IsAlive)

                      {

                          lock (locker)

                          {

                              _default = new WeakReference(new ViewModel());

                          }

                      }

                      return _default.Target as ViewModel;

                  }

              }


              private ViewModel()

              {


              }


               ~ViewModel()

              {

                  MessageBox.Show("釋放 ViewModel"+Text);

              }


              private string _text = string.Empty;

              public string Text

              {

                  get

                  {

                      return _text;

                  }

                  set

                  {

                      _text = value;

                  }

              }


          }

      本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

      未標題-1.jpg

      上一篇:revit中尺寸標注的新奇方法

      下一篇:二次開發教程:WPF 給控件添加可以綁定的命令

      主站蜘蛛池模板: 亚洲日韩精品一区二区三区| 日美欧韩一区二去三区| 国产免费一区二区三区| 国产精品成人一区无码| 久久中文字幕一区二区| 一区二区三区视频网站| 国产精品无码一区二区三区毛片| 香蕉一区二区三区观| 国产成人一区二区动漫精品| 国产乱码一区二区三区四| 无码人妻少妇色欲AV一区二区| 精品成人av一区二区三区| 无码日韩精品一区二区人妻 | 日韩在线不卡免费视频一区| 精品国产AⅤ一区二区三区4区 | 人妻夜夜爽天天爽一区| 亚洲欧洲精品一区二区三区| 国产午夜精品免费一区二区三区| 一区二区三区高清视频在线观看| 国产av一区二区精品久久凹凸| 欧美激情国产精品视频一区二区| 无码一区18禁3D| 成人精品一区二区不卡视频| 国模视频一区二区| 国产精品福利一区| 一区二区三区无码高清| 中文字幕国产一区| 亚洲AV成人一区二区三区AV| 人妻久久久一区二区三区| 影音先锋中文无码一区| 无码人妻一区二区三区免费手机| 亚洲精品无码一区二区| 国产乱码精品一区二区三区麻豆| 国产日本亚洲一区二区三区| 成人毛片一区二区| 国产精品 一区 在线| 久久人妻内射无码一区三区| 国产对白精品刺激一区二区| 亚洲一本一道一区二区三区| 国模大胆一区二区三区| 亚洲国产一区视频|