Silverlight - как вызвать команду, основанную на свойстве с представлением - PullRequest
1 голос
/ 01 июня 2011

Я часами бился об эту голову, и я надеюсь, что кто-то может указать мне правильное направление.

У меня есть кнопка в моем виде, в которой есть событие щелчка и прикрепленная команда.Событие 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 и раскрывает или сворачивает его

Команда вызывает GetCFSDetailCommand из моей viewModel и т. Д.

Я застрял в том, что я хочу вызывать команду GetCFSDetailCommand только тогда, когда представление свернуто.Теперь он настроен так, что команда будет срабатывать при каждом нажатии кнопки.Я не могу использовать ICommand CanExecute, потому что я не хочу отключать кнопку.Буду признателен за любые предложения или идеи о том, как добиться этого.Одна мысль состояла в том, чтобы проверить видимость в коде события, а затем на основе этого события вызвать команду.Если это правильный подход, я был бы очень признателен за пример кода, поскольку мне не повезло в вызове команды из события.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 02 июня 2011

Установите свойство Command в DataTrigger

<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 свернута.В противном случае он не связан и ничего не произойдет.

1 голос
/ 01 июня 2011

Вы можете связать CommandParameter с видимостью вашей сетки, используя привязку, которая задает ElementName , а затем выбрать, выполнять или не выполнять вашу команду на основе значения параметр передан в команду.

CommandParameter = "{Binding ElementName = MyDetail , Path = Visibility }"

<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>

Возможно, вам придется изначально учитывать, что источник является нулевым, но я использовал XAML выше и смог передать видимость моему обработчику команд.

0 голосов
/ 02 июня 2011

Законно вызывать команду из события, и вы можете сделать это прямо из своего 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

...