DataTemplate Triggers im Button?(Silverlight)
-
Morgenskie liebe Gemeinde,
folgendes Szenario.Ich habe eine Page mit folgendem Xaml-Code:
<Grid x:Name="LayoutRoot"> <Border BorderBrush="Gray" BorderThickness="1"> <ScrollViewer> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Angemeldet als: " Foreground="Black" FontSize="16" /> <TextBlock x:Name="textblock_user" Text="" Foreground="#e65a0a" FontSize="16" FontWeight="Bold"/> </StackPanel> <TextBlock Text="Wählen Sie den Zielrechner aus,der hochgefahren werden soll:" Foreground="#e65a0a" FontSize="16" Margin="8 8 8 20"/> <data:DataGrid x:Name="datagridView"> <data:DataGrid.Columns> <data:DataGridTemplateColumn Header="Aktion"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button x:Name="btn_hochfahren" Content="hochfahren" Click="Button_Click"/> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> </data:DataGridTemplateColumn> </data:DataGrid.Columns> </data:DataGrid> </StackPanel> </ScrollViewer> </Border> </Grid>
So in das DataGrid wird eine Itemsource folgender Objekte gebunden:
public class WorkStationInformation { public string Benutzername { get; set; } public string Workstation { get; set; } public string MACAdresse { get; set; } public IPStatus Status { get; set; } public WorkStationInformation(string b, string w,string m,IPStatus status) { this.Benutzername = b; this.Workstation = w; this.MACAdresse = m; this.Status = status; } }
Soweit so gut, es wird auch alles korrekt angezeigt.Nun möchte ich aber folgendes erreichen.Wenn das Grid gefüllt wird, soll geschaut werden ob die Property "status" = Success ist. Wenn das der Fall ist, möchte ich den Button disablen.
Da ich den Button nicht so einfach aus C# code ansprechen kann, da er zu einem Datatemplate gehört, dachte ich mir ich muss da über Triggers rangehen, hatte da auch was probiert, jedoch wieder verwurfen,hat da jemand eine Idee?
-
mit trigger muesste das doch gehen - wie waren deine versuche?
-
<Grid x:Name="LayoutRoot"> <Border BorderBrush="Gray" BorderThickness="1"> <ScrollViewer> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Angemeldet als: " Foreground="Black" FontSize="16" /> <TextBlock x:Name="textblock_user" Text="" Foreground="#e65a0a" FontSize="16" FontWeight="Bold"/> <Button x:Name="aktuallisieren" Content="Aktuall" Click="aktuallisieren_Click" Height="100" Width="50"/> </StackPanel> <TextBlock Text="Wählen Sie den Zielrechner aus,der hochgefahren werden soll:" Foreground="#e65a0a" FontSize="16" Margin="8 8 8 20"/> <data:DataGrid x:Name="datagridView"> <data:DataGrid.Columns> <data:DataGridTemplateColumn Header="Aktion"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button x:Name="btn_hochfahren" Content="hochfahren" Click="Button_Click"/> <DataTemplate.Triggers> <Trigger SourceName="{Binding Status}" Value="Success"> <Setter TargetName="btn_hochfahren" Property="Enabled" Value="false"/> </Trigger> </DataTemplate.Triggers> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> </data:DataGridTemplateColumn> </data:DataGrid.Columns> </data:DataGrid> </StackPanel> </ScrollViewer> </Border> </Grid>
Ich dachte da an sowas.Jedoch bekam ich dann folgende Fehlermeldung:
Fehler 1 The property 'Triggers' does not exist on the type 'DataTemplate' in the XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.
Fehler 2 The tag 'Trigger' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.
Fehler 3 The property 'TargetName' does not exist on the type 'Setter' in the XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.?Hab ich ihn an der falschen seite gesetzt.Laut Fehlermeldung fehlen mir ja die Namespaces, jedoch sind es doch die Standardnamespaces oder?
-
merkwuerdig
kannst du solch ein trigger in einer einfachen listbox in der selben xaml setzen ?
-
Kein Erfolg.
-
dann stimmt was mit deiner xaml nicht
zeig ma den header
DataContext.Triggers gibts doch - wuesste nicht warum er des nicht findet /=
-
<navigation:Page x:Class="WOL.Views.UserView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Fehlt ne Assambly? Ich dacht die wären im Standard namespace mit drinne.
-
Benutz doch nen Style für den Button der ausgeblendet werden soll und dort setzt du den Trigger rein. Das Datatemplate direkt ist der falsche Ort dafür.
Außerdem wirst du wahrscheinlich noch nen IValueConverter brauchen um deinen String "sucess" in nen Objekt IPStatus zu konvertieren um die dann im Trigger vergleichen zu können.
-
Hmm gute Idee. Danke
-
wenn du eh n converter schreiben musst - warum dann nicht gleich ein converter von IPStatus -> Boolean ?
kannst dann direkt ohne style das IsEnabled binden und convertieren
<Button Content="hochfahren" Click="Button_Click" IsEnabled="{Binding Status, Converter={StaticResource statusToBoolean}}" />
-
Ok ich hab nun ein IValueConverter.
public class IPStatusConverter : IValueConverter { #region IValueConverter Member public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { WOL.SQLDataService.IPStatus status = (WOL.SQLDataService.IPStatus)value; if (status == WOL.SQLDataService.IPStatus.Success) return true; return false; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { bool succes = (bool)value; if (succes) return WOL.SQLDataService.IPStatus.Success; return WOL.SQLDataService.IPStatus.Unknown; } #endregion }
Der steht nun in einer Seperaten Klasse,wie krieg ich nun aber auf diese Klasse und den Converter bezug in meiner XAML von meiner einen Page?
-
als resource hinzufuegen
<page xmlns:converter="..."> <page.Resources> <converter:IPStatusConverter x:Key="ipStatusConverter" /> </page.Resources> <bla bla="{Binding ..., Converter={StaticResoure ipStatusConverter}}" /> </page>
//tag vergessen
-
Haaa, naklar, hatte nur nich dran gedacht das es als Ressource rein muss.
Vielen Danke. Hab das erwünschte Ziel erreicht.