2016-04-25 16 views
1

Ich versuche herauszufinden, welcher meiner Slider das Event aufgerufen hat, daher kann ich die OutputAnalogChannel-Methode mit dem Index des Sliders und dem Slider-Wert aufrufen. Meine Sliders, die möglicherweise das Ereignis aufrufen könnten, werden genannt:Überprüfen, welches Objekt das ValueChanged-Ereignis eines Sliders aufgerufen hat

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

Also nichts ist falsch mit dem folgenden Code, es funktioniert, aber ich fühle mich wie das ist eine sehr "schlechte" Art, dieses Problem zu lösen. Was ich dachte, ist, dass dem Slider eine Art 'zusätzlicher' Integerwert hinzugefügt wird, der dem korrekten Slider am Index entspricht.

Ehrlich gesagt versteckt sich diese Antwort wahrscheinlich irgendwo auf stackoverflow, aber ich bin mir nicht sicher, wonach ich suchen würde, also habe ich hier gepostet. Danke im Voraus!

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

die Eigenschaft Name @VisualVincent bereits verwendet wird, durch den angegebenen Namen oben {K8055AnalogOutputSlider1, K8055AnalogOutputSlider2, [...], K8055AnalogOutputSlidern} – Encore

+1

Sie könnten verwenden die Eigenschaft "Tag" der Steuerelemente und setzen Sie den Index dort. –

+0

Das habe ich gesehen, nachdem ich den Code richtig formatiert habe. :) –

Antwort

1

Sie können die Eigenschaft 'Tag' der Steuerelemente verwenden. Stellen Sie einfach die Eigenschaft auf den Index der Kontrolle und überprüfen Sie es dann in Ihren Event-Handler:

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

Dies ist ein wenig mehr Arbeit, aber es macht die Dinge unglaublich einfach zu modifizieren und zu pflegen und zu lesen. Es fängt auch an, einige sehr leistungsfähige Funktionen von WPF zu nutzen. Aber wenn Sie unter strengem Termindruck stehen, hat Vincents schnelle Lösung die Tugend der Einfachheit.

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

Ich wusste über Datenbindung und MVVM, hatte aber nicht die Zeit, es richtig zu lernen. Aber ich werde es definitiv als Referenz verwenden, wenn ich es irgendwann mit diesem Muster neu schreibe. Danke vielmals! – Encore

+0

@Encore Mein Vergnügen –

Verwandte Themen