Ich versuche, eine benutzerdefinierte ListView (MyListView) eine Schaltfläche hinzufügen, die einen in MyListView definierten Befehl (MyCustomCommand) auslöst. Ich habe die Schaltfläche (und einen Titeltext) hinzugefügt, indem ich eine ControlTemplate anwendete. Das Problem ist, dass ich keine Möglichkeit gefunden habe, MyCustomCommand auszulösen, wenn ich auf die Schaltfläche klicke. Was ich schließlich erreichen möchte, ist ein Popup oder ContextMenu zu öffnen, wo ich auswählen kann, welche Spalten in der ListView sichtbar sein sollen.WPF: Binden an Befehl von ControlTemplate
Hier ist meine Vorlage Quelle:
<Style TargetType="local:MyListView">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:MyListView">
<Border Name="Border" BorderThickness="1" BorderBrush="Black">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid Background="LightSteelBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Margin="3,3,3,3" Text="{TemplateBinding HeaderTitle}" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Stretch" FontSize="16" />
<Button Margin="3,3,3,3" Grid.Column="1"
VerticalAlignment="Center" HorizontalAlignment="Right" Height="20"
Command="{TemplateBinding MyCustomCommand}">A button</Button>
</Grid>
<ScrollViewer Grid.Row="1" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
<ItemsPresenter />
</ScrollViewer>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Hier ist die Definition für MyListView:
public class MyListView : ListView
{
public static readonly DependencyProperty MyCustomCommandProperty =
DependencyProperty.Register("MyCustomCommand", typeof(ICommand), typeof(MyListView));
private static RoutedCommand myCustomCommand;
public ICommand MyCustomCommand
{
get
{
if (myCustomCommand == null)
{
myCustomCommand = new RoutedCommand("MyCustomCommand", typeof(MyListView));
var binding = new CommandBinding();
binding.Command = myCustomCommand;
binding.Executed += binding_Executed;
CommandManager.RegisterClassCommandBinding(typeof(MyListView), binding);
}
return myCustomCommand;
}
}
private static void binding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("Command Handled!");
}
public static readonly DependencyProperty HeaderTitleProperty =
DependencyProperty.Register("HeaderTitle", typeof(string), typeof(MyListView));
public string HeaderTitle { get; set; }
}
Und hier ist das XAML, die eine einfache Instanz MyListView erstellt:
<local:MyListView VerticalAlignment="Top" HeaderTitle="ListView title">
<ListView.View>
<GridView>
<GridViewColumn Width="70" Header="Column 1" />
<GridViewColumn Width="70" Header="Column 2" />
<GridViewColumn Width="70" Header="Column 3" />
</GridView>
</ListView.View>
<ListViewItem>1</ListViewItem>
<ListViewItem>2</ListViewItem>
<ListViewItem>1</ListViewItem>
<ListViewItem>2</ListViewItem>
</local:MyListView>
Beachten Sie HeaderTitle, das an die DependencyProperty in MyListView gebunden ist. Dies funktioniert wie erwartet. Warum funktioniert es nicht mit Befehlen? Irgendwelche Hinweise, wie man das funktioniert?
Dank viel. Das hat meinen Fall gelöst :) Jetzt kann ich ein Popup öffnen, wenn der Befehl ausgeführt wird. –
Ich bin auf ein neues Problem gestoßen ... Die Schaltfläche zum Auslösen des Befehls ist nur in der ersten Instanz von MyListView in einem Fenster verfügbar (aktiviert). Hat es etwas mit dem Schlüsselwort Static in: Command = {x: Static local: MyListView zu tun.MyCustomCommand} –
Schaltflächen mit Befehlen werden deaktiviert, wenn entweder CanExecute des Befehls false ist oder der Befehl keinen Execute-Handler hat. Stellen Sie sicher, dass nichts Ungewöhnliches mit CanExecute passiert und dass die CommandBinding auf jeder ListView-Instanz und nicht in einem statischen Kontext eingerichtet wird, der nur die erste betrifft. –