检查哪个对象调用了滑块​​的ValueChanged事件

时间:2016-04-25 19:11:17

标签: c# wpf events invoke

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

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

所以下面的代码没有问题,它有效,但我觉得这是解决这个问题的一种非常“糟糕”的方法。 我在想的是,某些“附加”整数值被添加到Slider,它对应于索引处的正确Slider。

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

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);
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这是一项更多的工作,但它使得修改,维护和阅读变得非常容易。它还可以让您开始利用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>