完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
    * 主體類(lèi)型
    * 企業(yè)名稱(chēng)
    * 信用代碼
    * 所在行業(yè)
    * 企業(yè)規(guī)模
    * 所在職位
    * 姓名
    * 所在行業(yè)
    * 學(xué)歷
    * 工作性質(zhì)
    請(qǐng)先選擇行業(yè)
    您還可以選擇以下福利:
    行業(yè)福利,領(lǐng)完即止!

    下載app免費(fèi)領(lǐng)取會(huì)員

    NULL

    ad.jpg

    二次開(kāi)發(fā)教程:WPF DataContent內(nèi)存釋放問(wèn)題

    發(fā)布于:2019-07-25 15:06:21

    網(wǎng)友投稿

    更多

    最近發(fā)現(xiàn)一個(gè)有趣的事,通過(guò)Window.dataContent來(lái)設(shè)置綁定以后,


    窗體關(guān)閉以后 ViewModel 并沒(méi)有釋放,再次調(diào)用改窗體后,前一個(gè)ViewModel才釋放,


    或者是程序關(guān)閉以后才釋放 ,搞不懂。。。


    如果要馬上釋放ViewModel可以在Window關(guān)閉以后將DataContent 設(shè)置為null ,


    這樣ViewModel是可以釋放的


    下面是測(cè)試代碼,大神請(qǐng)指教!




    主窗體:


    <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();

            }

        }




    測(cè)試窗體:


    <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)

            {


                //注釋這個(gè)行就能看出差別


                DataContext = null;

            }

        }




    測(cè)試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;

                }

            }


        }

    本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

    未標(biāo)題-1.jpg

    上一篇:revit中尺寸標(biāo)注的新奇方法

    下一篇:二次開(kāi)發(fā)教程:WPF 給控件添加可以綁定的命令

    60acb4e0ef112.png
    主站蜘蛛池模板: 日韩免费一区二区三区| 日韩精品中文字幕无码一区 | 精品一区二区三区在线观看l| 欧美日韩一区二区成人午夜电影| 精品国产日韩亚洲一区| 日韩精品无码Av一区二区| 久久精品国内一区二区三区| 亚洲一区综合在线播放| 亚洲乱码国产一区三区| 色系一区二区三区四区五区| 中文字幕在线一区二区在线| 精品国产一区二区三区久久蜜臀| 一区五十路在线中出| 在线精品一区二区三区电影| 精品少妇人妻AV一区二区三区| 国产精品香蕉在线一区| 精品无码一区二区三区电影| 久久精品国产第一区二区三区 | 日本在线不卡一区| 国产在线精品一区二区中文| 国产乱码伦精品一区二区三区麻豆 | 亚洲AV无码一区二区乱孑伦AS| jazzjazz国产精品一区二区| 精品一区二区三区视频| 一区二区三区免费视频网站| 亚洲欧洲一区二区三区| 精品人妻少妇一区二区| 国产香蕉一区二区精品视频| 国产精品揄拍一区二区| 狠狠做深爱婷婷久久综合一区| 麻豆va一区二区三区久久浪| 日本精品视频一区二区三区| 精品一区二区三区水蜜桃| 一区二区三区日本视频| 日韩综合无码一区二区| 2022年亚洲午夜一区二区福利| 极品尤物一区二区三区| 国产精品资源一区二区| 国模私拍福利一区二区| 风间由美在线亚洲一区| 国产情侣一区二区三区|