| 

.NET C# Java Javascript Exception

2
Hallo, ich versuche mich gerade in PRISM und MVVM einzuarbeiten. Dabei habe ich folgendes Problem. Ich habe nachfolgende XAML-Datei:
<dx:DXWindow
x:Class="Views.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism"
Title="Test1" Height="700" Width="1100"
SnapsToDevicePixels="True" UseLayoutRounding="True"
dx:ThemeManager.ThemeName="Office2010Black">

<dxlc:TileLayoutControl Name="TLC1" prism:RegionManager.RegionName="ModuleRegion" TileClick="{Binding Path=TileClickCommand}">
<dxlc:Tile Header="System Informationen" Name="SystemInformationen" />
<dxlc:Tile Header="Schließen" Name="Schliessen" Size="Small" Background="#FFC14AAF" />
<dxlc:Tile Header="Einstellungen" Name="Einstellungen" Size="Small" Background="#FF5CA332" />
</dxlc:TileLayoutControl>
</dx:DXWindow>

Ich benutze hier das TileLayoutControl von DevExpress. Dieses Control wirft beim anklicken eines Tile's ein TileClick-Event. Wenn man es auf die althergebrachte Art macht steht in der CodeBehind-Datei folgendes:
Private Sub TileClick(sender As System.Object, e As DevExpress.Xpf.LayoutControl.TileClickEventArgs) Handles TLC1.TileClick
Dim Name As String = e.Tile.Name
End Sub

Über die EventArgs kann ich hier den Namen des Tile's ermitteln das angeklickt wurde. Nun möchte ich aber diesen CodeBehind-Teil nicht haben sondern es über Commands lösen. Ich habe dazu in meiner ViewModelDatei auch schon einen Command angelegt und ihn auch schon in meiner XAML-Datei gebunden. Siehe oben
TileClick="{Binding Path=TileClickCommand}"
Das funktioniert soweit auch schon. Beim anklicken eines Tile's wird der Command ausgeführt. Ich müsste jetzt natürlich noch wissen welches Tile angeklickt wurde.

Wie komme ich mit meinem Command an die EventArgs der CodeBehind-Datei?
Kann mir da jemand weiterhelfen?
Macht man das eventuell ganz anders?
Ich bin über jede Hilfe dankbar.

Mit freundlichen Grüßen
Michael Kempf
News:
07.03.2012
br93roco 41 1 2
2 Antworten
0
Hallo Michael,

wenn DevExpress PRISM richtig unterstützt (Hinweis: Einige Control Hersteller haben hier noch Nachholbedarf) dann müsstest das TileClick Binding gegen das PRISM CommandBinding ausgetauscht und um den CommandParamter erweitert werden:
<dxlc:TileLayoutControl Name="TLC1" prism:RegionManager.RegionName="ModuleRegion"
prism:Click.Command="{Binding Path=SubmitCommand}"
prism:Click.CommandParameter="TLC1">


Im ViewModel führst Du dann eine DelegateCommand Eigenschaft
public DelegateCommand<string> SubmitCommand { get; set; }


ein, die Du im Constructor initialisierst:
SubmitCommand = new DelegateCommand<string>(GotoSubmitCommand);


und in der angegebenen Methode den Parameter verarbeitest:
private void GotoSubmitCommand(string index)
{
..
}

Gruss
Dirk
08.03.2012
judgy 3,0k 1 1 8
0
Hallo Dirk,

ich habe das jetzt einmal ausprobiert. Funktioniert leider nicht.
prism:Click.Command ...
wird nicht unterstützt. Bei dieser Lösung müsste man Prism doch auch irgendwie sagen, dass das Click.Command für den TileClick-Event benutzt werden soll. Weil das ja nicht das einzige Event des TileLayoutControl ist. Ich habe das in der Zwischenzeit anders gelöst. Ich benutze nun im Tile-Control das Command und CommandParameter Property. Sieht dann wie folgt aus:
<dx:DXWindow
x:Class="Views.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxd="http://schemas.devexpress.com/winfx/2008/xaml/docking"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism"
Title="Spectio" Height="700" Width="1100"
SnapsToDevicePixels="True" UseLayoutRounding="True"
dx:ThemeManager.ThemeName="Office2010Black">

<dxlc:TileLayoutControl Name="TLC1" prism:RegionManager.RegionName="ModuleRegion" >
<dxlc:TileLayoutControl.Background>
<ImageBrush ImageSource="/Spectio.Shell;component/Images/Spectio.png" Stretch="None" TileMode="Tile" Viewport="0,0,569.079417503447,365.050944444215" ViewportUnits="Absolute" >
<ImageBrush.Transform>
<TransformGroup>
<ScaleTransform ScaleX="0.14" ScaleY="0.14" />
<RotateTransform Angle="45" />
</TransformGroup>
</ImageBrush.Transform>
</ImageBrush>
</dxlc:TileLayoutControl.Background>
<dxlc:Tile Header="System Informationen" Name="SystemInformationen" Command="{Binding Path=TileClickCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Name}">
<!--<Image Name="image1" Stretch="None" Source="Images/System.png" />-->
</dxlc:Tile>
<dxlc:Tile Header="Schließen" Name="Schliessen" Size="Small" Background="#FFC14AAF" Command="{Binding Path=TileClickCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Name}">
<!--<Image Name="image2" Stretch="None" Source="Images/Research.png" />-->
</dxlc:Tile>
<dxlc:Tile Header="Einstellungen" Name="Einstellungen" Size="Small" Background="#FF5CA332" Command="{Binding Path=TileClickCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Name}">
<!--<Image Name="image3" Stretch="None" Source="Images/Statistics.png" />-->
</dxlc:Tile>
</dxlc:TileLayoutControl>
</dx:DXWindow>

Ich habe einen eigenen Command geschrieben dem ich als Parameter den Namen des Tile-Control übergebe. Ist jetzt zwar ein bisschen mehr Schreibarbeit, aber so funktioniert es eigentlich wie ich will.

Gruss
Michael
09.03.2012
br93roco 41 1 2
Hallo Michael,
es ist ein Problem mit den meisten Control-Herstellern, dass sie MVVM und/oder PRISM nicht richtig unterstützen.
Für Silverlight und WPF ist da nur Telerik zu empfehlen, die dies auf jeden Fall unterstützen.
Dirk
judgy 09.03.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH