wpf - practices - Wie binde ich ein StackPanel an mein ViewModel?




wpf validation mvvm (2)

Aus meiner Sicht habe ich das:

<TextBlock Text="{Binding Title}"/>

die an die Title-Eigenschaft meines ViewModels bindet und das ist einfach und funktioniert gut :

private string _title;
public string Title
{
    get
    {
        return _title;
    }

    set
    {
        _title = value;
        OnPropertyChanged("Title");
    }
}

Allerdings hat mein ViewModel auch die Eigenschaft "FormFields", die ein StackPanel ist, das eine Anzahl anderer UserControls enthält:

private StackPanel _formFields;
public StackPanel FormFields
{
    get
    {
        return _formFields;
    }

    set
    {
        _formFields = value;
        OnPropertyChanged("FormFields");
    }
}

Wie verbinde ich das aus meiner Sicht?

In ASP.NET gab es ein PlaceHolder- Element, ich suche nach etwas mit der gleichen Funktionalität, z

PSEUDO CODE:

<PlaceHolder Content="{Binding FormFields}"/>

Erstens, nicht. Anstatt die Benutzeroberfläche von Ihrer VM aus zu diktieren, sollten Sie Daten diktieren (das Modell). Mit anderen Worten, der Eigenschaftstyp sollte ObservableCollection<FormField> . Dann würde Ihre Ansicht wie folgt binden:

<ItemsControl ItemsSource="{Binding FormFields}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        <ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Nachdem Sie das gesagt haben, können Sie mit einem ContentPresenter das StackPanel greifen und in den visuellen Baum stecken:

<ContentPresenter Content="{Binding FormFields}"/>

Haben Sie versucht, ein Border oder nur ein einfaches Grid ?

<Border Content="{Binding FormFields}" />

Trotzdem hinterfrage ich das Design. Die Formularfelder sollten in einer Ansicht enthalten sein, und die Ansicht sollte in einer Datenvorlage angegeben werden, die basierend auf dem Ansichtmodelltyp instanziiert wird. Ich würde nicht persönlich tun, was du im Code tust.

Prost.





mvvm