2016-04-25 2 views
1

Я пытаюсь определить, какой из моих слайдеров вызывается для события, поэтому я могу вызвать метод OutputAnalogChannel с указателем ползунка и значением ползунка. Мои ползунки, которые потенциально могут ссылаться на событие, называются:Проверьте, какой объект вызвал событие ValueChanged для слайдера

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

Так что нет ничего плохого в следующем коде, он работает, но я чувствую, что это является очень «плохим» способом решения этой проблемы. Что я думал о том, что какое-то «дополнительное» целочисленное значение добавляется к слайдеру, который соответствует правильному слайдеру в индексе.

Честно говоря, этот ответ, вероятно, скрывается где-то в 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

@VisualVincent Свойство имя уже используется, по именам, указанным выше {K8055AnalogOutputSlider1, K8055AnalogOutputSlider2, [...], K8055AnalogOutputSlidern} – Encore

+1

Вы можете использовать свойство «Tag» элемента управления и установите там индекс. –

+0

Я видел, что после форматирования кода правильно. :) –

ответ

1

Вы можете использовать свойство управления Tag. Просто установите свойство индекса контроля, а затем проверить его в обработчик события:

K8055.OutputAnalogChannel((int)slider.Tag, (int)slider.Value); 
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> 
+0

Я знал о привязке данных и MVVM, но не успел его правильно изучить. Но я обязательно буду использовать это как ссылку, как только я в конечном итоге переписал ее с использованием этого шаблона. Большое спасибо! – Encore

+0

@ Encore Мое удовольствие –

Смежные вопросы