質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

6475閲覧

C# WPFのTabControl上の情報をTab切替後も保持したい

riko0109

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2020/07/20 06:26

前提・実現したいこと

C# WPFで簡単なエディターを製作しています。
TabControl上にテキストボックスを配置したコントロールを使っています。
TabControl上のテキストボックスを編集した後別タブに切り替えて当該タブを
もう一度選択すると編集した内容がクリアされ、初期の文字列が表示されてしまいます。
Tabcontrol上の情報を保持する方法はありますか?

発生している問題・エラーメッセージ

TabControl上のテキストボックスの編集内容が保持されません。
ViewModelは独自で定義したTabItemクラスを持つObservableCollectionです。

該当のソースコード

TabControlのビューモデル
private static ObservableCollection<TabItem> _Tabs { get; set; } = new ObservableCollection<TabItem>();
public static ObservableCollection<TabItem> Tabs
{
get
{
return _Tabs;
}
set
{
_Tabs = value;
}
}

TabControlのビュー
<Grid>
<TabControl x:Name="Tab" ItemsSource="{Binding}" DataContext="{Binding}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}">
<Button Content="×" Margin="5,5,0,0" BorderThickness="0" Background="Transparent" Command="{Binding ExecuteCmd}" CommandParameter="{Binding TabID}"/>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Contents, Mode=TwoWay}"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>

</Grid>

試したこと

補足情報(FW/ツールのバージョンなど)

visual studio Community 2019
.NET FrameWork 4.7.2

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

xml

1<TextBox Text="{Binding Contents, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

これで十分なら話は早いです。これだけで機能します。


PropertyChangedにできない(したくない)場合は、タブの切り替え時にTextBoxLostFocusが呼ばれないようなので、無理やり呼ぶような感じでしょうか。

cs

1using System.Collections.ObjectModel; 2using System.ComponentModel; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Input; 6 7namespace Questions279056 8{ 9 public partial class MainWindow : Window 10 { 11 public ObservableCollection<TabItem> Tabs { get; set; } = new ObservableCollection<TabItem>(); 12 public MainWindow() 13 { 14 InitializeComponent(); 15 DataContext = Tabs; 16 Tabs.Add(new TabItem { Header = "Tab1", Contents = "aaa" }); 17 Tabs.Add(new TabItem { Header = "Tab2", Contents = "bbb" }); 18 Tabs.Add(new TabItem { Header = "Tab3", Contents = "ccc" }); 19 20 Tab.IsSynchronizedWithCurrentItem = true; 21 Tab.Items.CurrentChanging += Items_CurrentChanging; 22 } 23 24 private void Items_CurrentChanging(object sender, CurrentChangingEventArgs e) 25 { 26 if(Keyboard.FocusedElement is TextBox textBox) 27 textBox.RaiseEvent(new RoutedEventArgs(LostFocusEvent)); 28 } 29 } 30 31 public class TabItem 32 { 33 public string Header { get; set; } 34 public string Contents { get; set; } 35 } 36}

(もうちょっとましな方法がある気がする^^;

投稿2020/07/20 08:46

編集2023/07/22 09:24
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riko0109

2020/07/20 08:52

ありがとうございます! 要望通りの挙動になりました! ちなみにUpdateSourceTrigger=PropertyChangedにしたくない、極力してはいけないといった シチュエーションがあるんでしょうか?
riko0109

2020/07/20 09:21

ありがとうございます! 今のところバリデーションチェックは実装してないので実装するときの参考にさせていただきます。 迅速なご回答ありがとうございました!
TN8001

2022/09/17 04:48 編集

パフォーマンスに関して 例えばVisual Studioも(すくなくともガワは)WPF製で(TextBoxクラスではないですが)エディタ部は入力ごとに構文チェック等が走っているはずですから、そこまで神経質になることはないと思います。 入力がもたつくとか何か気になる症状が出てからでいいと思います^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問