Допустим, в моем приложении есть следующие классы.
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public SolidColorBrush Brush { get; set; }
public MainWindow()
{
InitializeComponent();
Brush = new SolidColorBrush(Colors.AliceBlue);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 window = new Window1();
window.DataContext = this;
window.ShowDialog();
Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, (Action)delegate
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
});
}
MainWindow.xaml
<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" >
<Button Click="Button_Click">Do It</Button>
</Window>
Window1.xaml.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
~Window1()
{
Debug.WriteLine("Window1 Finalized");
}
}
Window1.xaml
<Window x:Class="WpfApplication8.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"
Background="{Binding Brush}">
<Grid>
</Grid>
</Window>
Когда я запускаю приложение, нажимаю кнопку Do It
и закрываю открытое окно - Debug.WriteLine("Window1 Finalized");
не выполняется. Это означает, что объект Window1 все еще находится в памяти, а не в GCed. Но если я уберу привязку кисти из Window1.xaml
- строка «Window1 Finalized» появится в выводе Это означает, что объект Window1 является GCed.
Как привязка хранит объект в памяти? Это ошибка или способ привязки реализован?
Редактировать 1
Если я связываю свойство Foreground вместо свойства Background, Window1 завершается. Похоже, это не системный эффект зависимости, а эффект реализации свойства Background.