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

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

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

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

WPF

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

Q&A

解決済

1回答

2177閲覧

WPFのWindow.VisibilityのBindingが動作していないように見える

ikarimame

総合スコア37

C#

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

WPF

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

1グッド

0クリップ

投稿2023/03/14 08:04

編集2023/03/14 08:05

OS:Windows11Pro
開発環境:VisualStudio2022
使用言語:C#

MainのViewとSubのView2つで同じ1つのViewModelをDataContextに持ち
MainのViewに配置したComboBoxでViewModelのSubVisibilityを経由してSubのViewのVisibilityを切り替える
以下のようなプログラムを書いています

App.xaml

xaml

1<Application x:Class="WpfApp1.App" 2 ... 3 Startup="Application_Startup"> 4 <Application.Resources> 5 </Application.Resources> 6</Application>

App.xaml.cs

c#

1... 2namespace WpfApp1 3{ 4 public partial class App : Application 5 { 6 private void Application_Startup(object sender, StartupEventArgs e) 7 { 8 var mainwindow = new MainWindow(); 9 var subwindow = new SubWindow(); 10 var viewmodel = new ViewModel(); 11 12 mainwindow.DataContext = viewmodel; 13 subwindow.DataContext = viewmodel; 14 15 mainwindow.Show(); 16 subwindow.Show(); 17 } 18 } 19}

MainWindow.xaml

xaml

1<Window x:Class="WpfApp1.MainWindow" 2 ... 3 Title="MainWindow" Height="450" Width="800"> 4 <Grid> 5 <ComboBox ItemsSource="{Binding VisibilityItems}" SelectedItem="{Binding SubVisibility}"/> 6 </Grid> 7</Window>

SubWindow.xaml

xaml

1<Window x:Class="WpfApp1.SubWindow" 2 ... 3 Title="SubWindow" Height="450" Width="800" Visibility="{Binding SubVisibility}"> 4 <Grid> 5 <TextBlock Text="{Binding SubVisibility}"/> 6 </Grid> 7</Window>

ViewModel.cs

c#

1... 2namespace WpfApp1 3{ 4 internal class ViewModel : INotifyPropertyChanged 5 { 6 public event PropertyChangedEventHandler PropertyChanged; 7 public void RaisePropertyChanged(string propertyName) 8 { 9 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 10 } 11 12 public Visibility[] VisibilityItems { get=>new Visibility[] { Visibility.Visible, Visibility.Hidden }; } 13 14 private Visibility _subVisibility = Visibility.Visible; 15 public Visibility SubVisibility 16 { 17 get { return _subVisibility; } 18 set { _subVisibility = value; RaisePropertyChanged(nameof(SubVisibility)); } 19 } 20 } 21} 22

しかしなぜかMainのViewのComboBoxを切り替えてもSubのViewのVisibilityが切り替わりません
試しにSubのViewにSubVisibilityの内容を表示してみましたが、そちらは正しく切り替わっています、なぜかSubWindow.Visibilityだけが切り替わりません
これはなぜなのでしょうか?

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

追記
subwindow.Show()が余計のようです(SubVisibilityのバインドで表示されるのだからShowを呼ぶ必要がない)


xml

1Visibility="{Binding SubVisibility, Mode=TwoWay}"

とすれば動きましたが、なんでWindowだけ特別なのかはわかりません。

Hiddenから初めれば(subwindow.Show()もしない)TwoWayなしでも動きました。
Show周りに何か(仕様という名の)バグがあるのかもしれません(調べる気は全くないです^^;

投稿2023/03/14 09:07

編集2023/03/14 09:27
TN8001

総合スコア9419

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

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

TN8001

2023/03/14 09:12

ほかのコントロールが自分から消えることは、普通ないのだから意味的にはいいのかなぁ? でもだったらなしで動いてるほうがおかしいってことか??よーわからんw
ikarimame

2023/03/14 09:26

回答ありがとうございます、Modeの変更は試していませんでした、確かにTwoWayですと動作しました またご指摘のようにShowWindowの有無で以下のように挙動が変わりました 1.ShowWindowしたWindowはMode=TwoWayなら動作する 2.ShowWindowしていないWindowはMode=TwoWayの他OneWayや未指定でも動作する(初期表示もViewModel.SubVisibilityの初期値で変わる) 今回はVisibilityをBindingするSubWindowに関してはShowWindowしない方向で行こうと思います。
TN8001

2023/03/14 09:26

`subwindow.Show()`が余計のようです(`SubVisibility`のバインドで表示されるのだから`Show`を呼ぶ必要がない)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問