フォルダ分けするとItemsControlで表示できなくなってしまいます。

Category: fx wpf_ja

Question

yayamama18 on Thu, 08 Aug 2019 00:09:48


お世話になります。

ユーザーコントロールを作り、そのObservableCollectionをItemsControlにバインドしています。

プロジェクト直下にView.cs, ViewModel.cs, Model.csがある場合、問題なく表示されるのですが

View/View.cs、ViewModel/ViewModels.cs、Model/Model.csのようにフォルダ分けして実行すると

ユーザーコントロールに値がバインドできなくなってしまいます。

フォルダ分けに際してxamlも適切に変更しているつもりですが原因はほかにあるのでしょうか。

解決策をお教えください。よろしくお願いします。

フォルダ分けしない場合

<Window x:Class="TEST.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespaceTEST"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <Viewbox>
                <StackPanel>
                    <ItemsControl ItemsSource="{Binding Path=Ivms}" Margin="10">
                        <ItemsControl.Resources>
                            <DataTemplate DataType="{x:Type local:ItemViewModel}">
                                <local:UserControlItem/>
                            </DataTemplate>
                        </ItemsControl.Resources>
                    </ItemsControl>
                </StackPanel>
            </Viewbox>
            
        </StackPanel>
    </Grid>
</Window>


フォルダ分けする場合

<Window x:Class="FOLDER_TEST.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:v="clr-namespace:FOLDER_TEST.View"
        xmlns:vm="clr-namespace:FOLDER_TEST.ViewModel"
        xmlns:local="clr-namespace:FOLDER_TEST"
        
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <Viewbox>
                <StackPanel>
                    <ItemsControl ItemsSource="{Binding Path=Ivms}" Margin="10">
                        <ItemsControl.Resources>
                            <DataTemplate DataType="{x:Type vm:ItemViewModel}">
                                <v:UserControlItem/>
                            </DataTemplate>
                        </ItemsControl.Resources>
                    </ItemsControl>
                </StackPanel>
            </Viewbox>
        </StackPanel>
    </Grid>
</Window>




Replies

trapemiya on Thu, 08 Aug 2019 01:39:23


どのフォルダにあるのかと名前空間は関係ありませんよ。
つまり、フォルダ分けしても名前空間が変わらないのであれば、元の、
xmlns:local="clr-namespace:TEST"
のままで良いです。

#掲載されたコードでは、xmlns:local="clr-namespaceTEST"とコロンが無いですが、これは単にタイポですよね?

yayamama18 on Thu, 08 Aug 2019 03:16:34


説明不足で申し訳ございませんでした。

上記2システムは別のプロジェクトでございます。

フォルダ分けしない場合に表示されした場合に表示されなかったので

質問した次第でございます。

trapemiya on Thu, 08 Aug 2019 05:05:49


バインドできない時に出力ウィンドウにエラーメッセージが出てると思いますので、それを確認してみて下さい。
別プロジェクトであっても基本的は同じです。どのフォルダにあるかは関係ありません。
ちなみにフォルダ分けしないで元の位置に戻すと表示されるのでしょうか?
繰り返しになりますが、いずれにしてもエラーメッセージが手掛かりになります。

ShiroYuki_Mot on Thu, 08 Aug 2019 06:37:14


yayamama18 さま よろしく。

違っていたら、ごめんなさい。

もし、既存プロジェクトを元にフォルダ新設移動したのだとすると、
ソリューション並びにプロジェクトファイル内の記述(パス)は整合していますか?。
IDE では無く、外部から、それらのファイルを覗いて確認して見て下さい。

yayamama18 on Fri, 09 Aug 2019 04:34:31


回答ありがとうございます。

解決はしていませんが、原因はわかりました。

UserControlにUserControlのViewModelを

<UserControl.DataContext>
        <viewmodel:TestViewModel/>
    </UserControl.DataContext>

上記のようにバインドさせていたのですが

これをなくしMainWindowにのみ

<Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>

を書くときちんと表示されました。

このような書き方でよいのでしょうか…?

trapemiya on Fri, 09 Aug 2019 06:01:25


UserControlのDataContextが何かというのは極めて基本的で重要なことなので、それが変わると言うのはかなり大きなことです。
それを行ったら表示されたということですので、TestViewModelではなく、MainWindowViweModelがUserControlにバインドして表示されるようになったと推測しますが、通常、そのように都合よくViewModelを変えられるような設計になっていないはずです。

フォルダ分けとは関係ない部分で何か問題がありそうな気がします。
私が先に述べた、表示されない時のエラーメッセージはどのようなものなのでしょうか?

ShiroYuki_Mot on Fri, 09 Aug 2019 06:35:46


yayamama18 さま 拝見しました。

私が余計な事を書いた所為で、混乱してしまいそうなので、
一先ず、trapemiya さまの仰られる通り、
エラーメッセージ内容を提示して下さい。

 個人的には、フォルダ構成を弄った段階で、何か不整合が入り込んでしまった気がしていましたので、
 先の投稿を入れました。
 一旦、これは忘れて下さい。
 尚、エラー提示と共に、過去の作業手順を示されるとヒントがあるかも知れません。

Haruka6002 on Thu, 29 Aug 2019 02:10:31


yayamama18さん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。

ご質問いただいた件ですが、その後いかがでしょうか。
追加でご確認いただいたことなどあれば、追記いただくことで回答がつきやすくなります。

また、皆様から寄せられた投稿はお役に立ちましたか。
参考になった投稿には [回答としてマーク] をお願い致します。

設定いただくことで、
他のユーザーもお役に立つ回答を見つけやすくなります。

お手数ですが、ご協力の程どうかよろしくお願いいたします。


MSDN/ TechNet Community Support Haruka

~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、
ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~