完善主體資料,免費贈送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 給控件添加可以綁定的命令

      主站蜘蛛池模板: 国产精品区一区二区三在线播放| 中文激情在线一区二区| 91久久精品国产免费一区| 中文字幕日韩人妻不卡一区 | 亚洲欧美成人一区二区三区| 久久精品一区二区免费看| 国产人妖视频一区在线观看| 国产精品亚洲一区二区无码| 无码视频一区二区三区在线观看| 国产精品区一区二区三| 国产福利精品一区二区| 一区二区三区亚洲视频| 国产精品视频分类一区| 国产另类TS人妖一区二区| 国产免费一区二区三区VR| 91精品国产一区二区三区左线| 日韩有码一区二区| 亚洲av色香蕉一区二区三区| 国产一区二区电影| 精品一区二区三区色花堂| 国产成人av一区二区三区在线观看| 91在线精品亚洲一区二区| 麻豆精品久久久一区二区| 无遮挡免费一区二区三区| 丝袜美腿一区二区三区| 久久精品一区二区三区AV| 亚洲乱色熟女一区二区三区丝袜 | 无码人妻久久一区二区三区免费| 无码人妻一区二区三区在线 | 国产成人欧美一区二区三区| 人妻体内射精一区二区| 亚洲伦理一区二区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 精品一区二区三区在线成人| 亚洲精品无码一区二区| 国产精品亚洲一区二区三区在线| 国产aⅴ一区二区| 亚洲综合无码一区二区痴汉| 中文字幕一区二区区免| 精品国产免费观看一区| 国产成人一区二区三中文|