Ich bin noch ziemlicher Neuling, was WPF und überhaupt die MVVM-Programmierung angeht. Deshalb eine Frage, die hoffentlich nicht zu kompliziert zu lösen ist.
Ich würde gern den Teil im UI ausblenden
<Border
Style="{StaticResource MainBorderStyle}"
Grid.Column="2"
Grid.Row="2">
<ContentControl
Content="{Binding Path=Buttons}"
ContentTemplate="{StaticResource ButtonsTemplate}"
Style="{StaticResource ButtonsCCStyle}"/>
</Border>
wenn im Content keine Buttons enthalten sind. In nächster Instanz soll erkannt werden, wo überhaupt welche Buttons benötigt werden, abhängig vom WorkspaceContent.
<DockPanel>
<DockPanel DockPanel.Dock="Top" KeyboardNavigation.TabNavigation="None">
<Menu KeyboardNavigation.TabNavigation="Cycle">
<MenuItem Header="_File">
<MenuItem Header="E_xit" Command="{Binding Path=CloseCommand}" />
</MenuItem>
<MenuItem Header="_Edit" />
<MenuItem Header="_Options" />
<MenuItem Header="_Help" />
</Menu>
</DockPanel>
<Grid Margin="4">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="4" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="4" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border
Style="{StaticResource MainBorderStyle}"
Width="180"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="3">
<ContentControl
Content="{Binding Path=Commands}"
ContentTemplate="{StaticResource CommandsTemplate}"
Style="{StaticResource CommandsCCStyle}"/>
</Border>
<Border
Style="{StaticResource MainBorderStyle}"
Grid.Column="2"
Grid.Row="0">
<HeaderedContentControl
Content="{Binding Path=Workspaces}"
ContentTemplate="{StaticResource WorkspaceContentTemplate}"
Header="{Binding Path=Workspaces}"
HeaderTemplate="{StaticResource WorkspaceHeaderTemplate}"
Style="{StaticResource WorkspaceHCCStyle}"/>
</Border>
<Border
Style="{StaticResource MainBorderStyle}"
Grid.Column="2"
Grid.Row="2">
<ContentControl
Content="{Binding Path=Buttons}"
ContentTemplate="{StaticResource ButtonsTemplate}"
Style="{StaticResource ButtonsCCStyle}"/>
</Border>
</Grid>
</DockPanel>
Hallo, da ich nicht genau weiß was dein zweites Problem ist hier mal ein paar Vorschläge zum ausblenden der Border. Du könntest:
Buttons
-Property liegt und halt abhängig des Counts der Liste das gewünschte Verhalten zurückgibtButtons
binden, bräuchtest dann aber einen (z.B. ListCountToVisibilty-) Converter. (Genauso würde es auch funktionieren wen du dem ContentControl einen Namen verpaßt und dich auf die Content-Property bindest)So ich glaube du hast jetzt genug Auswahlmöglichkeiten 😃 Vielleicht beantwortet das ja dein zweites Problem automatisch.
Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....
Hallo Cannon,
gehe da am besten nach folgendem Schema vor:
public sealed class FooViewModel //...
{
//...
public MenuViewModel Menu //Returnt null, wenn keine Buttons vorhanden
//...
}
public sealed class MenuViewModel
{
//...
public ObservableCollection<CommandViewModel> Commands
//...
}
<!-- Datatemplate für FooViewModel -->
<DataTemplate ...>
<!-- ... -->
<ContentPresenter Content="{Binding Path=Menu}" />
</DataTemplate>
<!-- Datatemplate für MenuViewModel -->
<DataTemplate ...>
<ItemsControl ItemsSource="{Binding Path=Commands}" />
</DataTemplate>
<!-- Datatemplate für CommandViewModel-->
<DataTemplate ...>
<Button Command="{Binding Path=.}" Content="{Binding Path=Text}" />
</DataTemplate>
Sehr gute Ansätze, die mir auch wirklich weiter geholfen haben. Dennoch habe ich das Ganze jetzt etwas anders gelöst, zumindest fast. 😉
Da ich den Border doch nicht mehr verwenden will, entscheidet sich das nach den Buttons, die wirklich vorhanden sind, was angezeigt wird oder auch nicht. Dazu habe ich mir eine Klasse geschrieben, die im MainModel die einzelnen Buttons einfügt. Die Bindung dazu befindet sich dann im MainView. Später werde ich das so erweitern, dass die benötigten Buttons in jedem Workespace-View hinterlegt werden, sodass die MainView entscheiden kann, welche Buttons jetzt drin sein sollen oder welche nicht. Wenn keine Buttons drin sind, dann soll der Bereich (ohne Border) ausgeblendet werden, was im Großen und Ganzen auch fast funktioniert. Die Buttons liegen dann in einem einzelnen ContentControl:
<Border
Style="{StaticResource MainBorderStyle}"
Grid.Column="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<HeaderedContentControl
Grid.Row="0"
Style="{StaticResource WorkspaceHCCStyle}"
Header="{Binding Path=Workspaces}"
HeaderTemplate="{StaticResource WorkspaceHeaderTemplate}"
Content="{Binding Path=Workspaces}"
ContentTemplate="{StaticResource WorkspaceContentTemplate}" />
<ContentControl
Grid.Row="1"
Style="{StaticResource ActionButtonCCStyle}"
Content="{Binding Path=Buttons}"
ContentTemplate="{StaticResource ActionButtonTemplate}" />
</Grid>
</Border>
<Style x:Key="ActionButtonCCStyle" TargetType="{x:Type ContentControl}">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<ContentPresenter
ContentSource="Content"
ContentTemplate="{TemplateBinding ContentTemplate}"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataTemplate x:Key="ActionButtonTemplate">
<ItemsControl IsTabStop="False" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button
Margin="10,4,4,4" MinWidth="75"
Content="{Binding Path=DisplayName}"
Command="{Binding Path=Command}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
Einzig allein - StackPanel Orientation="Horizontal" - funktioniert nicht. DIe Elemente sind immer Vertical angeordnet, also die Buttons. Wieso ist das so?