Laden...

Bereich ausblenden

Erstellt von Cannon vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.175 Views
C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 12 Jahren
Bereich ausblenden

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>

109 Beiträge seit 2011
vor 12 Jahren

Hallo, da ich nicht genau weiß was dein zweites Problem ist hier mal ein paar Vorschläge zum ausblenden der Border. Du könntest:

  • die Visibility des Borders auf eine neue Property binden, welche neben deiner Buttons-Property liegt und halt abhängig des Counts der Liste das gewünschte Verhalten zurückgibt
  • einen Data-Trigger benutzen
  • du kannst die Visibility-Property ebenfalls auf Buttons 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, ....

5.742 Beiträge seit 2007
vor 12 Jahren

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>

C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 12 Jahren

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?