Wpf 事件命令不开火

Wpf 事件命令不开火,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我试图使用eventToCommand来确定用户何时在滑块控件上进行鼠标移动。然而,它永远不会被解雇。这包含在数据模板中 <DataTemplate x:Key="RunEventsTemplate"> <di:DIGroupBox Grid.Row="2" Header="Real-Time Modifications" DataContext="{Binding DataContext.ScenarioHelper.EventPlayingService,Relat

我试图使用eventToCommand来确定用户何时在滑块控件上进行鼠标移动。然而,它永远不会被解雇。这包含在数据模板中

<DataTemplate x:Key="RunEventsTemplate">
    <di:DIGroupBox Grid.Row="2" Header="Real-Time Modifications" DataContext="{Binding DataContext.ScenarioHelper.EventPlayingService,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <di:DIGroupBox Header="Audio" DataContext="{Binding CurrentAudioEvent}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <di:DILabel Content="Filename: " />
                    <di:DIComboBox Grid.Column="1" />
                    <di:DICheckBox Grid.Row="1">Loop Audio File?</di:DICheckBox>
                    <di:DIImageToggleButton Grid.Row="1" Grid.Column="1" Height="23" Width="23" HorizontalAlignment="Left" Image="PlayIcon_White"></di:DIImageToggleButton>
                </Grid>
            </di:DIGroupBox>
            <di:DIGroupBox Grid.Row="1" Header="Odors">
                <ItemsControl ItemsSource="{Binding VehicleOdors}" ItemTemplate="{StaticResource ScentTemplate}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel></WrapPanel>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
            </di:DIGroupBox>
            <di:DIGroupBox Grid.Row="2" Header="Lighting" DataContext="{Binding CurrentLightingEvent}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width=".3*" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <di:DILabel Content="Color: " />
                    <di:DILabel Grid.Row="1" Content="Strobe: " />
                    <StackPanel Grid.Column="1" Orientation="Horizontal">
                        <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter={x:Null}}" Content="Off" Margin="0,0,5,0" Height="23" Width="50"></di:DIRadioButton>
                        <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=White}" Content="White" Margin="0,0,5,0" Height="23" Width="50" />
                        <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=Red}" Content="Red" Margin="0,0,5,0" Height="23" Width="50"/>
                        <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=Blue}" Content="Blue"  Height="23" Width="50"/>
                    </StackPanel>
                    <StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
                        <TextBlock Text="Always On" Foreground="White" VerticalAlignment="Center" TextWrapping="Wrap" MaxWidth="50" Margin="0,0,5,0" />
                        <di:DISlider Minimum="0" Maximum="100" Value="{Binding StrobeRate}" >
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseUp">
                                      <cmd:EventToCommand Command="{Binding UserChangedSliderValueCommand}"></cmd:EventToCommand>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </di:DISlider>
                        <TextBlock Text="Fast Strobe" Foreground="White" VerticalAlignment="Center" TextWrapping="Wrap" MaxWidth="50" />
                    </StackPanel>
                </Grid>
            </di:DIGroupBox>
            <di:DIGroupBox Header="Smoke" Grid.Row="3" DataContext="{Binding CurrentSmokeEvent}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="60" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <di:DIToggleButton Content="Off" Width="50" Height="23">
                       </di:DIToggleButton>
                    <di:DILabel Grid.Column="1" Content="Intensity:" Margin="10,0,0,0" />
                    <di:DISlider Grid.Column="2" VerticalAlignment="Center" Value="{Binding Intensity}" Minimum="0" Maximum="100" >

                    </di:DISlider>
                </Grid>
            </di:DIGroupBox>
        </Grid>
    </di:DIGroupBox>
</DataTemplate>

我设置了一个断点,但它从未被击中。我正在使用.net 4.5,不确定您的DISlider是否可以作为标准WPF滑块来执行此操作,但您可以尝试。首先,您应该获得滑块的Thumb对象,请参阅:

然后听Thumb的DragCompleted事件,我的项目中的一个例子:

    #region Manage Deferred Scrolling

    void VerticalScrollBarLoaded(object sender, RoutedEventArgs e)
    {
        VerticalScrollBar.Track.Thumb.DragStarted -= ThumbDragStarted;
        VerticalScrollBar.Track.Thumb.DragCompleted -= ThumbDragCompleted;
        VerticalScrollBar.Track.Thumb.DragStarted += ThumbDragStarted;
        VerticalScrollBar.Track.Thumb.DragCompleted += ThumbDragCompleted;
    }

    void ThumbDragCompleted(object sender, DragCompletedEventArgs e)
    {
        IsDeferredScrolling = false;
        if (CancelSelectionCrossingPage)
            SelectionSettings.SelectedCells.Clear();
    }

    void ThumbDragStarted(object sender, DragStartedEventArgs e)
    {
        IsDeferredScrolling = true;
    }

    #endregion

也可以考虑绑定滑块值。我认为这应该是一个更好的方法。如果有困难,您可以继承控件并添加依赖项属性以实现此目的。

您在输出窗口中是否看到任何绑定错误?请尝试使用而不是首先使用,检查是否正确引发了“MouseUp”事件,因为这是第三方控件。然后按照Krish的建议,尝试调用命令。如果仍然不起作用,请检查您的绑定。谢谢您的帮助。滑块似乎不支持此功能。如果有人对确定滑块何时停止移动有任何建议,那就太好了。那么这个私有函数会去哪里呢?我会做一个自定义滑块吗?在你的代码后面哪里可以看到DISlider控件。如果您的datatemplate位于资源字典中,并且很难隐藏代码,则可以将上述代码放在行为中并使用该行为来管理这些事件,或者您可以编写一个自定义控件来继承DISlider,将代码放在其中并在datatemplate中使用。感谢您的帮助。事实证明,您不能使用普通交互事件触发器绑定到路由事件。你必须自己编造。我找到了下面的博客来解释它
private static Thumb GetThumb(Slider slider)
{
    var track = slider.Template.FindName("PART_Track", slider) as Track;
    return track == null ? null : track.Thumb;
}
    #region Manage Deferred Scrolling

    void VerticalScrollBarLoaded(object sender, RoutedEventArgs e)
    {
        VerticalScrollBar.Track.Thumb.DragStarted -= ThumbDragStarted;
        VerticalScrollBar.Track.Thumb.DragCompleted -= ThumbDragCompleted;
        VerticalScrollBar.Track.Thumb.DragStarted += ThumbDragStarted;
        VerticalScrollBar.Track.Thumb.DragCompleted += ThumbDragCompleted;
    }

    void ThumbDragCompleted(object sender, DragCompletedEventArgs e)
    {
        IsDeferredScrolling = false;
        if (CancelSelectionCrossingPage)
            SelectionSettings.SelectedCells.Clear();
    }

    void ThumbDragStarted(object sender, DragStartedEventArgs e)
    {
        IsDeferredScrolling = true;
    }

    #endregion