我正在尝试确定哪个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);
}
答案 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>