我一直在敲打这个问题几个小时,我希望有人能指出我正确的方向。
我的视图中有一个按钮,其中包含点击事件和附加的命令。 click事件根据当前状态将网格行的可见性设置为折叠或可见。
XAML
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="120" />
<RowDefinition x:Name="DetailHolder" Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="92.915" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button x:Name="DetailButton"
Grid.Column="1"
Width="107"
Height="23"
Margin="196,94,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click= "MoreDetail_Click"
Command="{Binding GetCFSDetailCommand}"
Content="View Details [+]" >
<Button.DataContext>
<mdc:SearchViewModel/>
</Button.DataContext>
</Button>
</Grid>
<Grid x:Name="MyDetail"
Grid.Row="1"
MinHeight="150"
Visibility="Collapsed">
<TextBlock Text="My Hidden Data" />
</Grid>
</Grid>
click命令调用一个方法来测试MyDetail部分的当前可视状态并展开或折叠它
Command从我的viewModel等调用GetCFSDetailCommand
我被困的地方是我只想在视图折叠时调用命令GetCFSDetailCommand。现在设置的方式是每次单击按钮时都会触发该命令。我不能使用ICommand CanExecute,因为我不想禁用该按钮。我很感激有关如何实现这一目标的任何建议或想法。一种想法是测试事件代码中的可见性,然后基于事件调用命令。如果这是正确的方法,我会非常感谢代码示例,因为我从一个事件中调用命令没有运气。
提前致谢
答案 0 :(得分:1)
您可以使用指定CommandParameter的绑定将ElementName绑定到网格的可见性,然后根据传递给参数的参数值选择执行或不执行命令命令。
CommandParameter =“{Binding ElementName = MyDetail ,路径= 可见性}”
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="120" />
<RowDefinition x:Name="DetailHolder" Height="*" />
</Grid.RowDefinitions>
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="92.915" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button x:Name="DetailButton"
Grid.Column="1" Width="107" Height="23" Margin="196,94,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top"
Command="{Binding GetCFSDetailCommand}"
CommandParameter="{Binding ElementName=MyDetail, Path=Visibility}"
Content="View Details [+]"
>
</Button>
</Grid>
<Grid x:Name="MyDetail" Grid.Row="1" MinHeight="150" Visibility="Collapsed">
<TextBlock Text="My Hidden Data" />
</Grid>
</Grid>
您可能必须首先考虑源为null,但我使用上面的XAML并且能够将可见性传递给我的命令处理程序。
答案 1 :(得分:1)
在DataTrigger中设置Command属性
<Button x:Name="DetailButton" Content="View Details [+]">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=MyDetail, Path=Visibility}"
Value="Collapsed">
<Setter Property="Command" Value="{Binding GetCFSDetailCommand}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<Button>
将在MyDetail面板折叠时设置命令。否则,它是未绑定的,什么都不会发生。
答案 2 :(得分:0)
从事件中调用命令是合法的,您也可以从XAML中直接执行。您也可以将可见性状态作为命令参数传递。
请参阅以下示例:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras"
<Rectangle Fill="White"
Stroke="Black"
Width="200"
Height="100">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<cmd:EventToCommand Command="{Binding TestCommand,
Mode=OneWay}"
CommandParameter="{Binding Text,
ElementName=MyTextBox,
Mode=OneWay}"
MustToggleIsEnabledValue="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
你将使用MvvmLight工具包。您可以通过NuGet轻松安装它。
来源:MvvmLight