簡體   English   中英

如何使用 ToggleButton 更改 ListBoxItem 中的命令

[英]How can I change command in ListBoxItem using ToggleButton

我想使用ToggleButton ( DevMode ) 更改命令,例如:

  • 如果IsCheckedtrue執行命令 (1)
  • 如果IsCheckedfalse執行命令 (2)

這是我的代碼:

<DockPanel>
   <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
      <ToggleButton x:Name="DevMode" HorizontalAlignment="Right" Width="120" Height="30" Content="Developer Mode"/>
   </StackPanel>

   <ListBox DockPanel.Dock="Bottom" ItemsSource="{Binding Tiles}" SelectedItem="{Binding SelectedTile}">
      <ListBox.ItemsPanel>
         <ItemsPanelTemplate>
            <UniformGrid Width="600" Height="600" RenderTransformOrigin="0.5, 0.5"
                             Rows="{Binding Path=GetRows}"
                             Columns="{Binding Path=GetCols}">
            </UniformGrid>
         </ItemsPanelTemplate>
      </ListBox.ItemsPanel>

      <ListBox.ItemTemplate>
         <DataTemplate>
            <Image Source="{Binding Path=ImagePath}">
               <i:Interaction.Triggers>
                  <i:EventTrigger EventName="MouseUp">
                     <i:InvokeCommandAction 
                                    <!--the command which I need to change-->
                        Command="{Binding DataContext.Command1, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"
                                    CommandParameter="{Binding DataContext.SelectedTile, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>
                  </i:EventTrigger>
               </i:Interaction.Triggers>
            </Image>
         </DataTemplate>
      </ListBox.ItemTemplate>
   </ListBox>
</DockPanel>

您可以將ToggleButtonIsChecked屬性綁定到您的視圖模型,但可能在視圖模型的上下文中給它一個比IsChecked更有意義的名稱。

<ToggleButton x:Name="DevMode" HorizontalAlignment="Right" Width="120" Height="30" Content="Developer Mode" IsChecked="{Binding IsChecked}"/>

由於您想根據標志執行兩個不同的命令或操作,您應該為此創建一個單獨的命令。 讓我們假設它是MyCommand 我認為您甚至不需要傳遞命令參數,因為無論如何都可以在您的視圖模型中使用SelectedTile屬性。

<i:InvokeCommandAction Command="{Binding DataContext.MyCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"
                       CommandParameter="{Binding DataContext.SelectedTile, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>

在您的視圖模型中,您可以根據IsChecked狀態決定執行哪種方法。 如果您有一個可以執行的委托,您也應該對其進行調整。

private bool CanExecuteMyCommand(object item)
{
   return IsChecked && Command1.CanExecute(item) || !IsChecked && Command2.CanExecute(item);
}

private void ExecuteMyCommand(object item)
{
   if (IsChecked && Command1.CanExecute(item))
      Command1.Execute(item);
   else if (!IsChecked && Command2.CanExecute(item))
      Command2.Execute(item);
}

請注意,代碼假定您也在其他地方重用Command1Command2 如果沒有,您可以刪除它們,而只使用它們的ExecuteCanExecute委托。

在不破壞 MVVM 的情況下執行此操作的最佳方法是使用具有如下數據觸發器的樣式:

<ListBox DockPanel.Dock="Bottom" ItemsSource="{Binding Tiles}" SelectedItem="{Binding SelectedTile}">
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <UniformGrid Width="600" Height="600" RenderTransformOrigin="0.5, 0.5" Rows="{Binding Path=GetRows}" Columns="{Binding Path=GetCols}">
        </UniformGrid>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Style>
    <Style TargetType="ListBox">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Image Source="{Binding Path=ImagePath}">
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseUp">
                                    <i:InvokeCommandAction Command="{Binding CommandB}"/>
                                    <!--Your other command-->
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Image>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=DevMode, Path=IsCecked}" Value="True">
                <!--Your trigger linked to the btn-->
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Image Source="{Binding Path=ImagePath}">
                                <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="MouseUp">
                                        <i:InvokeCommandAction Command="{Binding CommandA}"/>
                                        <!--Your command-->
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </Image>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ListBox.Style>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM