przypadku próby zdefiniowania CommandBindings
lub InputBindings
jako zasobów w App.xaml
, można zauważyć, że nie można z nich korzystać, ponieważ XAML nie pozwalają na skorzystanie albo:
<Window ... CommandBindings="{StaticResource commandBindings}">
lub ustaw powiązania poleceń z ustawiaczem stylu:
<Setter Property="CommandBindings" Value="{StaticResource commandBindings}">
ponieważ żadna z tych właściwości nie ma "ustawionego" akcesora. Używając idei w this post, wymyśliłem czysty sposób wykorzystania zasobów z App.xaml
lub dowolnego innego słownika zasobów.
Najpierw trzeba określić swoje powiązania polecenia i przypisania wejściowych pośrednio, jak każdy inny zasób:
<InputBindingCollection x:Key="inputBindings">
<KeyBinding Command="Help" Key="H" Modifiers="Ctrl"/>
</InputBindingCollection>
<CommandBindingCollection x:Key="commandBindings">
<CommandBinding Command="Help" Executed="CommandBinding_Executed"/>
</CommandBindingCollection>
a następnie zwrócić się do nich z XAML z innej klasy:
<Window ...>
<i:Interaction.Behaviors>
<local:CollectionSetterBehavior Property="InputBindings" Value="{StaticResource inputBindings}"/>
<local:CollectionSetterBehavior Property="CommandBindings" Value="{StaticResource commandBindings}"/>
</i:Interaction.Behaviors>
...
</Window>
CollectionSetterBehavior
to zachowanie wielokrotnego użytku, które nie "ustawia" właściwości na jego wartość, ale zamiast tego usuwa kolekcję i ponownie ją wypełnia. Tak więc kolekcja się nie zmienia, tylko jej zawartość.
Oto źródło dla zachowania:
public class CollectionSetterBehavior : Behavior<FrameworkElement>
{
public string Property
{
get { return (string)GetValue(PropertyProperty); }
set { SetValue(PropertyProperty, value); }
}
public static readonly DependencyProperty PropertyProperty =
DependencyProperty.Register("Property", typeof(string), typeof(CollectionSetterBehavior), new UIPropertyMetadata(null));
public IList Value
{
get { return (IList)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(IList), typeof(CollectionSetterBehavior), new UIPropertyMetadata(null));
protected override void OnAttached()
{
var propertyInfo = AssociatedObject.GetType().GetProperty(Property);
var property = propertyInfo.GetGetMethod().Invoke(AssociatedObject, null) as IList;
property.Clear();
foreach (var item in Value) property.Add(item);
}
}
Jeśli nie są zaznajomieni z zachowaniami, najpierw dodaj nazw:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
i dodać odpowiednie odniesienie do projektu.
Thanks Shou, ja spróbuję. Zakładam, że mogę używać nowych nazw poleceń, np. 'ApplicationCommands.MyCommand'?Jeśli nie, to nie odpowiada na moje pytanie. – ocodo
Możesz także użyć poleceń niestandardowych. –
Zmień przykład, aby użyć niestandardowego polecenia, a nie Wklej. Nie mogę znaleźć żadnego innego odniesienia do dodawania nowych poleceń do 'ApplicationCommands', czy możesz podać link? - Chciałbyś również pokazać użycie XAML, szczególnie jeśli różni się od '' - thank you. – ocodo