私は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が読み込まれます。
私はデザインモードにするときに使用する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コミュニティ版を使用しています。
は、あなたの答えをいただき、ありがとうございます。私はいくつかのフォローアップの質問がありますが、彼らはコメントのためにあまりにも言い方です。投稿するにはどうすればよいですか? – SuperMe
元の質問の一番下の部分を編集し、後続の質問を追加することができます。 – jsanalytics