0

このパターンとその背後にあるすべてのロジックを理解しようとしています。

そんなに難しいとは思いませんが、それでも簡単な作業で失敗しています。

私が書いた動作しない例で明確にしましょう:

モデル:

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しているので、これを実行するとうまくいくと思います。ViewModelPresenterContent

(この場合、子のプロパティを操作する方法がわからないため、このプロパティは と の両方にありModelます。)ViewModelModel.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 がないことPresenterContentViewModel示していますが、これは明らかに間違っています。Modelプロパティにバインドしようとすると、例外は同じです。

私は何を間違っていますか?

4

2 に答える 2