Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF/Silverlight:当命令参数更改时,如何进行按钮调用ICommand.CanExecute?_Wpf_Silverlight - Fatal编程技术网

WPF/Silverlight:当命令参数更改时,如何进行按钮调用ICommand.CanExecute?

WPF/Silverlight:当命令参数更改时,如何进行按钮调用ICommand.CanExecute?,wpf,silverlight,Wpf,Silverlight,当命令参数更改时,如何进行按钮调用ICommand.CanExecute 这是我当前的XAML <Button Content="Delete" Command="{Binding DeleteItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=DaGrid}" /> 编辑它看起来这只是WPF中的一个问题。奇怪。通常OnCommandParameterChanged调用UpdateCanExecu

当命令参数更改时,如何进行按钮调用ICommand.CanExecute

这是我当前的XAML

<Button Content="Delete" Command="{Binding DeleteItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=DaGrid}" />


编辑它看起来这只是WPF中的一个问题。

奇怪。通常OnCommandParameterChanged调用UpdateCanExecute(两个内部方法)。与CommandParameter的绑定是否按预期工作?

奇怪。通常OnCommandParameterChanged调用UpdateCanExecute(两个内部方法)。与CommandParameter的绑定是否按预期工作?

您需要调用以重新评估
CanExecute
。请注意,它将对所有命令重新求值,而不仅仅是您想要的命令。

您需要调用以重新求值
CanExecute
。请注意,它将重新评估所有命令,而不仅仅是您想要的命令…

我不确定您做错了什么,但下面是一个按钮由BindingParameter和CanExecute标志控制的示例。也许您的绑定参数不是DependencyProperty,因此,当它更改时,不会通知按钮

<UserControl x:Class="SilverlightICommandTest.MainPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         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"
         xmlns:ct="clr-namespace:SilverlightICommandTest"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
    <ct:TestModel x:Key="Model" />
</UserControl.Resources>

<StackPanel x:Name="LayoutRoot" Orientation="Vertical" Background="White" DataContext="{StaticResource Model}">
    <CheckBox Content="Enable" IsChecked="{Binding TestCmd.CanDoCommand, Mode=TwoWay}" />
    <Grid HorizontalAlignment="Stretch">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding ElementName=testSlider, Path=Value}" Width="40" Grid.Column="0" />
        <Slider Name="testSlider" Minimum="0" Maximum="100" SmallChange="1" Grid.Column="1" />
    </Grid>
    <Button Command="{Binding TestCmd}" CommandParameter="{Binding ElementName=testSlider, Path=Value}" Content="Do Something" />
</StackPanel>
</UserControl>

今后,我建议您首先对模式进行更多的研究(),如果您仍然无法理解,请发布更多的源代码。

我不确定您做错了什么,但下面是一个按钮同时由BindingParameter和CanExecute标志控制的示例。也许您的绑定参数不是DependencyProperty,因此,当它更改时,不会通知按钮

<UserControl x:Class="SilverlightICommandTest.MainPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         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"
         xmlns:ct="clr-namespace:SilverlightICommandTest"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
    <ct:TestModel x:Key="Model" />
</UserControl.Resources>

<StackPanel x:Name="LayoutRoot" Orientation="Vertical" Background="White" DataContext="{StaticResource Model}">
    <CheckBox Content="Enable" IsChecked="{Binding TestCmd.CanDoCommand, Mode=TwoWay}" />
    <Grid HorizontalAlignment="Stretch">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding ElementName=testSlider, Path=Value}" Width="40" Grid.Column="0" />
        <Slider Name="testSlider" Minimum="0" Maximum="100" SmallChange="1" Grid.Column="1" />
    </Grid>
    <Button Command="{Binding TestCmd}" CommandParameter="{Binding ElementName=testSlider, Path=Value}" Content="Do Something" />
</StackPanel>
</UserControl>


今后,我建议您先对模式进行更多的研究(),如果您仍然无法理解,请发布更多的源代码。

您似乎没有执行
CanExecute
处理程序。这是你的准确密码吗?是的,那是准确的密码。我不明白你的问题,CanExecute或Executed不是要处理的事件。@ChrisF,这只是CommandBindings需要的。。。CanExecute和Execute是由command@Thomas-干杯-我不确定您似乎没有执行
CanExecute
处理程序。这是你的准确密码吗?是的,那是准确的密码。我不明白你的问题,CanExecute或Executed不是要处理的事件。@ChrisF,这只是CommandBindings需要的。。。CanExecute和Execute是由command@Thomas-干杯-我不确定我只是用反射器检查了一下:命令和参数没有改变,至少WPF 4中没有。。。实际上,
CommandParameter
依赖属性上甚至没有
PropertyChangedCallback
,所以当参数值更改时没有什么特别的事情发生。呃,这真是个坏消息。很难相信他们错过了那个用例。@Thomas:我们在这里讨论的是Silverlight框架。DP在OnCommandParameterPropertyChanged回调中注册,该回调调用OnCommandParameterChanged@Jonathan:DependencyProperty,CommandParameter为一。在Silverlight中,CommandParameter的更改将直接导致ICommand.CanExecute,请确保绑定正常。@Ozan,您所说的是Silverlight框架;)。标题上写着“WPF/Silverlight”,不仅仅是Silverlight我刚刚用Reflector检查过:没有
onCommand和ParameterChanged
方法,至少在WPF 4中没有。。。实际上,
CommandParameter
依赖属性上甚至没有
PropertyChangedCallback
,所以当参数值更改时没有什么特别的事情发生。呃,这真是个坏消息。很难相信他们错过了那个用例。@Thomas:我们在这里讨论的是Silverlight框架。DP在OnCommandParameterPropertyChanged回调中注册,该回调调用OnCommandParameterChanged@Jonathan:DependencyProperty,CommandParameter为一。在Silverlight中,CommandParameter的更改将直接导致ICommand.CanExecute,请确保绑定正常。@Ozan,您所说的是Silverlight框架;)。标题是“WPF/Silverlight”,不仅仅是Silverlightwell,您的标题是“WPF/Silverlight”。。。所以你有一半问题的答案;)那似乎没什么用。我甚至尝试让我的命令显式注册CommmandManager.RequerySuggested事件。最后,我在CommandManager的基础上制定了自己的事件方案,但仅限于我感兴趣的命令。我不想发帖了,因为这不是一个通用的解决方案。。。所以你有一半问题的答案;)那似乎没什么用。我甚至尝试让我的命令显式注册CommmandManager.RequerySuggested事件。最后,我在CommandManager的基础上制定了自己的事件方案,但仅限于我感兴趣的命令。我不想发帖了,因为这不是一个通用的解决方案。仅供参考,在“什么是从属财产”的问题上要宽泛一点。DP是WPF/Silverlight模式,用于在属性更改时接收通知。使用DependencyObject.SetValue/GetValue方法代替使用私有本地成员存储值,这使框架有机会转发更改通知。WPF/Silverlight数据绑定依赖于此在源值更改时更新UI值。有关更多详细信息,请参阅。仅供参考,关于“什么是从属财产”的问题,请稍微宽泛一点。DP是WPF/Silverlight模式,用于在属性更改时接收通知。使用DependencyObject.SetValue/GetValue方法代替使用私有本地成员存储值,这使框架有机会转发更改通知。WPF/Silverlight数据绑定依赖于此在源值更改时更新UI值。有关更多详细信息,请参阅。