2016-09-09 17 views
4

私はListBoxを含むWPFウィンドウを持っています。 ItemsSourceは、ビューモデルのプロパティにバインドされています。WPFのデザインデータへのバインド

<Window x:Class="SimpleWpfApp.View.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" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding MainWindowViewModel, Source={StaticResource Locator}}"> 
    <DockPanel> 
    <ListBox ItemsSource="{Binding SomeThings}" /> 
    </DockPanel> 
</Window> 

ビューモデルのプロパティは、カスタムインターフェイスの観察可能なコレクションです。 ISomeInterface。このインターフェースは非常に簡単で、SomeClassによって実装され、ToStringをさらにオーバーライドします。

public class MainWindowViewModel 
{ 
    public ObservableCollection<ISomeInterface> SomeThings 
    { 
    get 
    { 
     var list = new List<ISomeInterface> 
     { 
     new SomeClass {Value = "initialised"}, 
     new SomeClass {Value = "in"}, 
     new SomeClass {Value = "code"} 
     }; 

     return new ObservableCollection<ISomeInterface>(list); 
    } 
    } 
} 

public interface ISomeInterface 
{ 
    string Value { get; } 
} 

public class SomeClass : ISomeInterface 
{ 
    public string Value { get; set; } 

    public override string ToString() => Value; 
} 

Visual Studio 2015またはブレンドでウィンドウを表示すると、すべてが期待通りに表示されます。 ToStringが呼び出され、ListBoxが読み込まれます。

Blend screenshot

私はデザインモードにするときに使用するXAMLの設計データを作成しました。私は、SampleDataというディレクトリに設計データを追加しました。私は最初のDataContextのすぐ下のウィンドウXAMLにデザインdatacontextステートメントを追加します。

d:DataContext="{d:DesignData Source=/SampleData/Data.xaml}" 

これは機能しません。 Visual StudioとBlendのレポートで、ソースパスに何を使用しているかにかかわらず、 'File or project item not found'と表示されます。私は/ SampleData/Data.xaml、SampleData/Data.xaml、../SampleData/Data.xaml、./../SampleData/Data.xamlを試しました。

Visual StudioとBlendは、それをSampleDataディレクトリからプロジェクトルートに移動します。次に、ソースパス/Data.xamlまたはData.xamlを使用して参照できます。私がData.xamlをプレフィックスなしで使用すると、Visual StudioとBlendは、ファイルが見つからないと報告しますが、とにかくそれを見つけます。

私の最初の質問は..サブディレクトリでサンプルデータを使用できますか?そしてもしそうなら、どのように?

プロジェクトルートでData.xamlを正常に参照していて、私のウィンドウはオーバーライドされたToStringを呼び出さないため、クラス名のリストが表示されます。リストにはデザインデータと同じ数の項目があり、デザインデータを使用しているようです。

私の2番目の質問は..オブジェクトがコードからインスタンス化されている場合、オーバーライドされたToStringがここで呼び出されないのはなぜですか?

私は、アイテムテンプレートを指定することで希望の結果を得ることができると思います。

<ListBox ItemsSource="{Binding SomeThings}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Value}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

完全なソースはgithubの

https://github.com/DangerousDarlow/WpfDesignData

UPDATE答えるためjstreetに

おかげで、例えばアプリケーションのために利用可能です。サブディレクトリ内のdata.xamlのファイルプロパティを変更しました。これを設計データとして使用できるようになりました。私はこれを前に試してみたと思ったが、間違いをしなければならない。

私はまだToStringが呼び出されているのを見ていません。私はList<object>と同様にList<ISomeInterface>にビューモデルのプロパティを変更しようとしましたが、両方ともobject.ToStringに呼び出されました。クラス名の表示によって推論される。とにかくToStringを使用しないので、私は表示したいプロパティにバインドします。しかし、行動の違いを説明すると良いでしょう。

私はVisual Studio 2015コミュニティ版を使用しています。

答えて

4

ここにいくつかの動作中のサンプルコードがあります。 This article - MSDNを参照してください。特に

、あなたのVSのプロジェクトであなたのData.xamlファイル(私の場合はDictionary1.xaml、)のプロパティを設定する方法を注意してください。

enter image description here

はまた、あなたのルートオブジェクトを作成する方法に注意してくださいSomeThings(私の場合はSomeClasses):コレクションの場合

は、ルートオブジェクトはArrayListのか、カスタムタイプすることができコレクションまたはジェネリックコレクションから派生...

XAML:

<Window x:Class="WpfApplication277.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-namespace:WpfApplication277" 
    d:DataContext="{d:DesignData Source=/SampleData/Dictionary1.xaml}" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ListView ItemsSource="{Binding}"></ListView> 
</Grid> 

Dictionary1.xaml:

あなたのVSのプロジェクトでSampleDataフォルダを右クリックします、および選択します。\ New Item \ WPF \ Resourcを追加します。電子辞書の場合は、その内容を設計データに置き換えます。これにより、デザインデータをサブフォルダに配置できるようになります。

<m:SomeClasses xmlns:m="clr-namespace:WpfApplication277"> 
<m:SomeClass Value="design data 1"> 
</m:SomeClass> 
<m:SomeClass Value="design data 2"> 
</m:SomeClass> 
<m:SomeClass Value="design data 3"> 
</m:SomeClass> 

SomeClassesは:List<SomeClass>ませの仕事をしてくれました!

public class SomeClasses : List<Object> 
{ 
    public SomeClasses() { } 
} 

工ass:ToString()は間違いなく呼び出されていることを

public class SomeClass : ISomeInterface 
{ 
    public string Value { get; set; } 

    public override string ToString() => string.Format("ToString() : {0}",Value); 
} 

注:

enter image description here

+0

は、あなたの答えをいただき、ありがとうございます。私はいくつかのフォローアップの質問がありますが、彼らはコメントのためにあまりにも言い方です。投稿するにはどうすればよいですか? – SuperMe

+0

元の質問の一番下の部分を編集し、後続の質問を追加することができます。 – jsanalytics

関連する問題