7662


WPF、.Net 4.5、Visual Studio 2013 Communityの環境で、  
デザイン時にItemsSourceにXAMLから値を設定する方法について知っている方が居れば教えて下さい。

XAML上でデザイン時`DataContext`を設定する時(`d:DataContext="{d:DesignData
Source=SomeDesignData.xaml}"`)の様な形で、`ItemsControl`系の`UIElement`に対してデザイン時`ItemsSource`を設定したいと思っています。

コード上で行うのであれば、対象となる`UIElement`の`DataContext`に設定されるクラスのコンストラクタで`DesignerProperties.GetIsInDesignMode(new
DependencyObject())`を使って条件分岐して`ItemsSource`の`Binding`先プロパティにデザイン用データをセットすれば良いのですが、これを使うといわゆるMVVMのVM層にデザイン用データが張り出してしまうため、出来れば避けたいと思っています。

何か良い方法、あるいは定石となる方法があれば教えて下さい。


CC BY-SA 3.0
2015-03-08T12:02:31.537
7611
2015-03-09T14:09:15.637
6119
question
c# visual-studio wpf
WPFのデザイン時ItemsSourceのXAMLでの設定方法について


デザイン時用のViewModelを用意してデザイン用データを持たせるといいんじゃないでしょうか。  
例えば、本番用のViewModelを継承してコンストラクタでデータを差し替え、とすると実装的にも楽です。

XAMLでBindするときはこんな感じで

`d:DataContext="{d:DesignInstance vm:DesignViewModel}"`


CC BY-SA 3.0
2015-03-09T02:26:58.710
7632
2015-03-09T02:26:58.710
3022
7611
answer


DataContextもd:DataContextもFrameworkElementの階層構造に従ったBindingのPathを受け継ぎます。  
つまり、

[code]

    <Grid x:Name="parentGrid">
        <ListBox x:Name="list1"/>
    </Grid>
    
[/code]

という親子関係があった場合、list1のItemsSourceを直接サンプルデータにBindするのではなく、parentGridのDataContext及びd:DataContextを指定し、list1のItemsSourceは{Binding
Items}などとparentGridのDataContextからの相対PathでBindして、

[code]

    <Grid x:Name="parentGrid" d:DataContext="{d:DesignData /SampleData/Foo.xaml}">
        <ListBox x:Name="list1" ItemsSource="{Binding Items}"/>
    </Grid>
    
[/code]

等としてやれば、DataContextにVMがBindされている場合はviewmodel.Itemsメンバに、デザイン時は、Foo.xamlのサンプルデータの階層構造のItemsに、それぞれコードビハインドを考慮することなく、ViewModelとサンプルデータを切り替えることができます。

> 参考:  
>  Web APIで取得したXML/JSONからVSデザイナで表示できるリアルなXAMLサンプルデータを作成する - Neutral Scent  
>  <http://d.hatena.ne.jp/kaorun/20131202/1385955900>


CC BY-SA 3.0
2015-03-09T14:09:15.637
7662
2015-03-09T14:09:15.637
2947
7611
answer