私のアプリケーションには、メイン ウィンドウで開くいくつかのユーザー コントロールがあります。ユーザーコントロールを開いて閉じると思います。各ユーザー コントロールには、任意の情報フォームと同じように、 pictures 、 textbox 、および label があります。ガベージ コレクターによってメモリが再利用されないことに気付きました。アプリケーションのメモリ リークを解決するための脆弱性をインターネットで検索しました。私の質問に対するいくつかの良い答えが見つかりましたが、それらのほとんどは .net Framework 3.5 以前に関連していました。メモリ プロファイラーを使用して、いくつかのアドバイスに基づいて手がかりを見つけました。メモリ プロファイラを使用すると、オブジェクトへのバインドによって引き起こされる弱い参照が多数見つかりました。これはリンクに従っており、親コントロールを削除する直前にバインディングを削除しようとしましたが、問題は解決しませんでした。ここにxamlコード:
<TextBox x:Name="nameTextBox" Text="{Binding Name, Mode=TwoWay}" />
モデルのインスタンスに DataContext を設定します。私のモデルは次のようになります
public class MyModel : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
if (name!= value)
{
name= value;
OnProperyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnProperyChanged(string propertyName)
{
if (PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}`
...
}
次のコードを使用してバインディングをクリアしようとしました:
BindingOperations.ClearBinding(nameTextBox,TextBox.TextProperty);
しかし、弱参照は消えませんでした。便利なコード プロジェクト ページを見つけましたが、これはイベント ハンドラー用です。最後に、私が言及したリンクを誤解している場合は、何をしなければならないかの手がかりを教えてください。バインディングの別の解決策がある場合。
注:リンクを確認しましたが、次の要素を削除する必要があることはわかっています。
- 親ウィンドウ内のオブジェクトへのイベント ハンドラー
- 静的オブジェクトからのイベントへの登録
- タイマーの使用
- データバインディング
- テキスト ボックスの Text プロパティを変更する