PreviewCanExecuteEventは実行されません
-
10-07-2019 - |
質問
WPFプログラムに問題があります。同じスコープ内のすべてのコントロールにハンドラーを追加するオブジェクトを作成しようとしています。
次の行は機能しません。イベントは処理されません。
element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler), true);
ボタンにバインドされたコマンドもあります。だからアイデアは、コマンドのCanExecuteを実行したいということです:これはうまくいきます。 PreviewCanExecuteのハンドラーも必要です。これは機能しません。
これ以上説明できないのは残念です。
以下の私のコードを参照してください:
XAML:
<Window.Resources>
<my:PermissionScope x:Key="permissionManager"/>
</Window.Resources>
<StackPanel>
<TextBox Height="23" Name="textBox1" Width="120" />
<Button Content="Permission Required" Command="{Binding Path=PermissionRequired}" my:PermissionScope.SharedPermissionScope="{StaticResource permissionManager}"/>
<Button Content="Permission not required" Command="{Binding Path=PermissionRequired}"/>
</StackPanel>
PermissionScope.cs
public class PermissionScope
{
public static readonly DependencyProperty SharedPermissionScopeProperty =
DependencyProperty.RegisterAttached("SharedPermissionScope", typeof(PermissionScope), typeof(PermissionScope),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(OnUseGlobalSharedPermissionScopeChanged)));
public static void SetSharedPermissionScope(DependencyObject depObj, PermissionScope scope)
{
// never place logic in here, because these methods are not called when things are done in XAML
depObj.SetValue(SharedPermissionScopeProperty, scope);
}
public static PermissionScope GetSharedPermissionScope(DependencyObject depObj)
{
// never place logic in here, because these methods are not called when things are done in XAML
return depObj.GetValue(SharedPermissionScopeProperty) as PermissionScope;
}
private static void OnUseGlobalSharedPermissionScopeChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
{
if (depObj is Button)
{
if (args.OldValue != null)
{
RemoveEventHandlers(depObj as UIElement, args.OldValue as PermissionScope);
}
if (args.NewValue != null)
{
AttachEventHandlers(depObj as UIElement, args.NewValue as PermissionScope);
}
}
}
private static void AttachEventHandlers(UIElement element, PermissionScope scope)
{
if (element != null && scope != null)
{
element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler), true); // we need to see all events to subvert the built-in undo/redo tracking in the text boxes
}
}
private static void RemoveEventHandlers(UIElement element, PermissionScope scope)
{
if (element != null && scope != null)
{
element.AddHandler(CommandManager.PreviewCanExecuteEvent, new CanExecuteRoutedEventHandler(scope.CanExecutedHandler));
}
}
private void CanExecutedHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (e.Command is CommandBase)
{
bool hasPermission = false;
hasPermission = ((CommandBase)e.Command).HasPermission();
ShowControl((UIElement)e.OriginalSource, hasPermission);
}
}
public static void ShowControl(UIElement element, bool show)
{
element.Visibility = show ? Visibility.Visible : Visibility.Collapsed;
}
}
本当に助けにはなりません。
よろしく、 マイケル
解決
自分のことを知りました。これはRoutedCommandsでのみ機能し、ICommandでは機能しません
所属していません StackOverflow