检查哪个对象调用了 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>
我正在尝试确定我的哪个滑块调用了事件,因此我可以使用滑块的索引和滑块值调用 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>