[英]How can I change command in ListBoxItem using ToggleButton
我想使用ToggleButton
( DevMode
) 更改命令,例如:
IsChecked
為true
執行命令 (1)IsChecked
為false
執行命令 (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>
您可以將ToggleButton
的IsChecked
屬性綁定到您的視圖模型,但可能在視圖模型的上下文中給它一個比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);
}
請注意,代碼假定您也在其他地方重用Command1
和Command2
。 如果沒有,您可以刪除它們,而只使用它們的Execute
和CanExecute
委托。
在不破壞 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.