检查哪个对象调用了 Slider 的 ValueChanged 事件

Check which object invoked the ValueChanged Event of a Slider

我正在尝试确定我的哪个滑块调用了事件,因此我可以使用滑块的索引和滑块值调用 OutputAnalogChannel 方法。 我的可能调用事件的滑块称为:

{ K8055AnalogOutputSlider1, K8055AnalogOutputSlider2, [...], K8055AnalogOutputSlider }

所以下面的代码没有问题,它可以工作,但我觉得这是解决这个问题的非常 'bad' 的方法。 我在想的是某种 'additional' 整数值被添加到滑块,它对应于索引处的正确滑块。

老实说,这个答案可能隐藏在 Whosebug 的某个地方,但我不确定我要搜索什么,所以我张贴在这里。提前致谢!

private void K8055AnalogOutputSliderValueChanged(object sender, RoutedEventArgs e)
{
    Slider slider = sender as Slider;
    K8055.OutputAnalogChannel(int.Parse(slider.Name[slider.Name.Length - 1].ToString()), (int)slider.Value);
}

您可以使用控件 Tag 属性。只需将 属性 设置为控件的索引,然后在您的事件处理程序中检查它:

K8055.OutputAnalogChannel((int)slider.Tag, (int)slider.Value);

这需要多做一些工作,但它使修改、维护和阅读变得异常容易。它还可以让您开始利用 WPF 的一些非常强大的功能。但是,如果您面临着严格的截止日期压力,文森特的速战速决具有简单的优点。

C#

public class ChannelViewModel : INotifyPropertyChanged
{
    private string _name = "";
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(Name)));
        }
    }

    private int _channel = 0;
    public int Channel
    {
        get { return _channel; }
        set
        {
            _channel = value;
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(Channel)));
        }
    }

    private int _value = 0;
    public int Value
    {
        get { return _value; }
        set
        {
            _value = value;
            K8055.OutputAnalogChannel(Channel, Value);
            PropertyChanged?.Invoke(this,
                new PropertyChangedEventArgs(nameof(Value)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        Channels.Add(new ChannelViewModel { Name="Fred", Channel = 1, Value = 3 });
        Channels.Add(new ChannelViewModel { Name="Bob", Channel = 2, Value = 35 });
    }

    public ObservableCollection<ChannelViewModel> Channels { get; private set; }
        = new ObservableCollection<ChannelViewModel>();

    public event PropertyChangedEventHandler PropertyChanged;
}

XAML

<ItemsControl
    ItemsSource="{Binding Channels}"
    BorderBrush="Black"
    BorderThickness="1"
    >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="2">
                <TextBlock>Channel 
                    <Run Text="{Binding Channel, Mode=OneWay}" />: 
                    <Run Text="{Binding Name, Mode=OneWay}" /></TextBlock>
                <Slider Value="{Binding Value}" Minimum="1" Maximum="100" Width="300" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>