このパターンとその背後にあるすべてのロジックを理解しようとしています。
そんなに難しいとは思いませんが、それでも簡単な作業で失敗しています。
私が書いた動作しない例で明確にしましょう:
モデル:
public class Model
{
public string Name { get; set; }
public string Description { get; set; }
public Categories Category { get; set; }
public Grid PresenterContent { get; set; }
}
ビューモデル:
public class ViewModel : ViewModelBase
{
private Model _model;
public Model Model
{
get
{
return _model;
}
set
{
if (_model != value)
{
_model = value;
RaisePropertyChanged(() => Model);
}
}
}
public Grid PresenterContent
{
get
{
return Model.PresenterContent;
}
private set { }
}
public ViewModel()
{
Model = new Model();
}
}
意見:
<UserControl.DataContext>
<Binding Source="ViewModel"/>
</UserControl.DataContext>
<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
<ContentPresenter Content="{Binding PresenterContent}"/>
</Grid>
プロパティを持つ を に設定DataContext
しているので、これを実行するとうまくいくと思います。ViewModel
PresenterContent
(この場合、子のプロパティを操作する方法がわからないため、このプロパティは と の両方にありModel
ます。)ViewModel
Model.PresenterContent
実際に起こることは、例外がスローされることです:
System.Windows.Data エラー: BindingExpression パス エラー: 'ViewModel' 'System.String' で 'PresenterContent' プロパティが見つかりません (HashCode=-903444198)。BindingExpression: Path='PresenterContent' DataItem='ViewModel' (HashCode=-903444198); ターゲット要素は 'System.Windows.Controls.ContentPresenter' (Name='') です。ターゲット プロパティは 'Content' (タイプ 'System.Object') です。
これは に no がないことPresenterContent
をViewModel
示していますが、これは明らかに間違っています。Model
プロパティにバインドしようとすると、例外は同じです。
私は何を間違っていますか?