Laden...

Content-Platzhalter mit XAML füllen

Erstellt von Davaaron vor 3 Jahren Letzter Beitrag vor 3 Jahren 939 Views
D
Davaaron Themenstarter:in
106 Beiträge seit 2016
vor 3 Jahren
Content-Platzhalter mit XAML füllen

Hi,

ich refactore etwas und brauche etwas Hilfe.
Viele meiner Views sind nach dem gleichen Schema aufgebaut: Header, Content1, Content2. Dabei sind in jeder View die Styles definiert sowie das Grid und alles was dazu gehört.
Da die Applikation viel MVVM benutzt, habe ich mir überlegt, ein gemeinsames ViewModel zu erstellen und ein Control, welches das Layout-Schema liefern soll. Die ViewModels erben dann vom Layout-VM und die Inhalte kann ich ja dann per Binding im ContentPresenter füllen.
In der View kann ich das Layout dann so benutzen (DataContext ist ein VM, welches von ArctionSearchResultPanelViewModel erbt):


    <local:ActionSearchResultPanel DataContext="{Binding }"/>

Jetzt habe ich aber festgestellt, dass es sich für einfache Inhalte in Content1/Content2 nicht lohnt, eine neue View und VM zu erstellen, weil sie lediglich nur einen string binden oder dergleichen.

Praktisch wäre so was:


  <local:ActionSearchResultPanel DataContext="{Binding }">
        <local:ActionSearchResultPanel.Content1>
            <TextBox Text="{Binding MyName}"></TextBox>
        </local:ActionSearchResultPanel.Content1>
        <local:ActionSearchResultPanel.Content2>
            <ListView ItemsSource="{Binding MyList}"></ListView>
        </local:ActionSearchResultPanel.Content2>
    </local:ActionSearchResultPanel>

Irgendwo habe ich die Syntax schon mal gesehen, aber ich weiß nicht wie sie genannt wird und komme daher auf kein Ergebnis beim Suchen. Die Properties, die ich bei der suche gesehen hatte, sahen nicht nach dem aus. Kann mir jemand weiterhelfen?

Zusätzliche Infos:

Die XAML für ActionSearchResultPanel sieht so aus:


 <Grid>
        <Grid.ColumnDefinitions>

        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
            <RowDefinition Height="3*"/>
        </Grid.RowDefinitions>
        
        <StackPanel Orientation="Horizontal">
            <ItemsControl ItemsSource="{Binding ActionCmds}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
        <ContentPresenter x:Name="SearchViewContent" Grid.Row="1" Content="{Binding SearchView}"/>
        <ContentPresenter x:Name="ResultViewContent" Grid.Row="2" Content="{Binding ResultView}"/>
    </Grid>

Das ViewModel sieht so aus:


private ObservableCollection<ButtonCommandViewModel> actionCmds = new ObservableCollection<ButtonCommandViewModel>();
        private BaseViewModel resultView;

        private BaseViewModel searchView;

        public ObservableCollection<ButtonCommandViewModel> ActionCmds
        {
            get { return actionCmds; }
            set { SetField(ref actionCmds, value); }
        }
        public BaseViewModel ResultView
        {
            get { return resultView; }
            set { SetField(ref resultView, value); }
        }

        public BaseViewModel SearchView
        {
            get { return searchView; }
            set { SetField(ref searchView, value); }
        }

5.657 Beiträge seit 2006
vor 3 Jahren

Viele meiner Views sind nach dem gleichen Schema aufgebaut: Header, Content1, Content2.

Das trifft auf so ziemlich alle Anwendungen zu. Was bei dir so speziell ist, sagst du nicht. Dein vorgeschlagener Lösungsweg ist aber nicht nachvollziehbar. Wozu sollte man ViewModels, CustomControls oder "speziellen Syntax" verwenden, um ein einfaches Layout zu erstellen? Eventuell kennst du DataTemplates noch nicht? Siehe [Artikel] MVVM und DataBinding, Abschnitt 5

Weeks of programming can save you hours of planning