gpt4 book ai didi

c# - 如果我将一个控件绑定(bind)到另一个控件,而其中一个控件消失了,绑定(bind)会发生什么情况?

转载 作者:行者123 更新时间:2023-11-30 22:36:03 25 4
gpt4 key购买 nike

例如,让我们采用程序化绑定(bind):

Binding binding = new Binding("MyProperty");
binding.Converter = new BooleanToVisibilityConverter();
binding.Source = myWindow.myObject

myButton.SetBinding(Button.VisibilityProperty, binding);

如果 myWindow 死机并被垃圾收集会发生什么......我是否也负责释放绑定(bind),或者它知道如何自己做?

最佳答案

这对于绑定(bind)不是真的,即使您将 Source 用于 Binding,您也不会有内存泄漏。

为了验证这一点

  • 在 Xaml 中创建一个 StackPanel、一个 TextBox (tb1) 和两个 Button
  • 在后面的代码中创建一个新的 TextBox (tb2)
  • 在 tb1 上设置一个 BindingSource 设置为 tb2
  • 在 tb2 上创建一个 WeakReference(如果我们有泄漏,它不应该被 GC)
  • 将 tb2 添加到 StackPanel
  • 运行程序并验证绑定(bind)是否有效
  • 点击移除
  • 点击是否还活着?

它返回 false,源 TextBox (tb2) 已被垃圾回收,因此我们没有内存泄漏

编辑:您还可以将第一个 TextBox 的创建从 Xaml 移动到代码隐藏并使用两个 WeakReferences(一个用于每个 TextBox) 并验证两个文本框是否都正确地进行了 GC,您将看到这是真的。

Xaml

<StackPanel Name="stackPanel">
<TextBox Name="textBox"/>
<Button Name="removeButton" Content="Remove" Click="removeButton_Click"/>
<Button Name="isAliveButton" Content="Is Alive?" Click="isAliveButton_Click"/>
</StackPanel>

代码隐藏

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TextBox toBeGCdTextBox = new TextBox();
stackPanel.Children.Add(toBeGCdTextBox);
Binding textBinding = new Binding
{
Path = new PropertyPath("Text"),
Source = toBeGCdTextBox
};
textBox.SetBinding(TextBox.TextProperty, textBinding);
_weak = new WeakReference(toBeGCdTextBox);
}
private WeakReference _weak;
private void isAliveButton_Click(object sender, RoutedEventArgs e)
{
GC.Collect();
MessageBox.Show(_weak.IsAlive.ToString());
}

private void removeButton_Click(object sender, RoutedEventArgs e)
{
Debug.Assert(_weak.Target == stackPanel.Children[3]);
stackPanel.Children.Remove(stackPanel.Children[3]);
}
}

关于c# - 如果我将一个控件绑定(bind)到另一个控件,而其中一个控件消失了,绑定(bind)会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7181947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com