Hallo zusammen,
Ich hab mir ein ControlTemplate für UserControls erstellt. Im Speziellen geht es dabei um UserControls, die Dialoge darstellen sollen. Daher wollte nicht in jedem UserControl die Buttons für Ok und Abbrechen und die Titelleiste einfügen, sondern das ganze als ControlTemplate nur einmal realisieren und eben aus den einzelnen UserControl entsprechend verwenden.
Nur irgendwie bekommen ich das nicht bzw. mir fehlt da ehrlich gesagt komplett der Ansatz.
hier erst einmal das ControlTemplate
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTemplate TargetType="UserControl" x:Key="DialogTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="LightBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Ok" x:Name="OkButton" BorderThickness="0" Padding="0" Margin="0" HorizontalAlignment="Left" />
<Button Grid.Column="1" Content="X" x:Name="CloseButton" BorderThickness="0" Padding="0" Margin="0" HorizontalAlignment="Right" />
</Grid>
<Border Grid.Row="1" Background="White">
<ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</Grid>
</ControlTemplate>
</ResourceDictionary>
Wenn ich das Template auf meine UserControls anwende funktioniert das vom Design her schon mal ganz gut. Aber wie kann ich von den UserControls aus auf die Buttons reagieren?
Ich verwende als MVVM Framework Caliburn.Micro. daher hab ich mir gedacht, dass ich per NamingConvention vielleicht ganz einfach darauf zugreifen kann
public void OkButton()
Aber das war wohl nichts.
Vielleicht kann mir da jemand auf die Sprünge helfen, wie ich das machen kann oder vielleicht hab ich auch vollkommen den falschen Ansatz.
Danke schon mal
Ich bin mir nicht ganz sicher wie es bei Caliburn läuft, es gibt ja wenn ich mich recht entsinne keine Command sondern nur Methoden und Properties die über die NamingConventions zugeordnet werden oder?
Ich bin mir daher an der Stelle nicht sicher wie es im Zusammenhang mit dem DataContext aussieht. Hast Du es mal mit einem "normalen" Command probiert und über z.B. die RelativeSoruce den entsprechenden DataContext gesetzt.
Irgendwelche Binding-Fehler im Debugger zu sehen?
Gruß
t0ms3n
Ohne Commands wird das nix werden...
Dialoge sind übrigens etwas, dass im herkömlichen Sinne vom MVVM nicht vorgesehen ist. Wenn du Dialoge erstellst, hast du die Möglichkeit :
Entweder: Jedes mal ein neues Window zu verwenden - der einfachste weg, reicht für 80% aller Fälle vollkommen aus
Oder : Über UserControls/DataTemplates und View-ViewModel Komponentenbindung etwas zusammen zu schustern...IOC-Container sind das sehr hilfreich
Noch ein kleiner gut gemeinter Rat :es ist nicht besonders praktikabel für ein UserControl ein ControlTemplate anzulegen, da die Controltemplates für eigene Steuerelemente gedacht sind und du dort nicht die bequemlichkeit des DataTemplates hast. ControlTemplates benötigen normalerweise auch ein haufen an zusätzlichen TemplateBindings gegen alle möglichen Design-Eigenschaften wie Horizontal- und VerticalAlignment...sonst machen die nicht das was man gerne möchte...
vg
Wenn's zum weinen nicht reicht, lach drüber!