PropertyChangedEventHandler ist null, wenn die Einstellung der Eigenschaft
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:myapp="clr-namespace:MyPlayer.Model"
mc:Ignorable="d"
x:Class="MyPlayer.VolumeButtons"
x:Name="UserControl"
d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
<myapp:MusicPlayerModel x:Key="Model"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" DataContext="{StaticResource Model}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="35px"/>
<ColumnDefinition Width="1.0*"/>
</Grid.ColumnDefinitions>
<Slider Value="{Binding Volume}" Margin="0,0,0,0" Grid.Column="1" VerticalAlignment="Center" x:Name="volumeSlider"/>
<Button Margin="4,4,4,4" Content="Button" x:Name="muteButton" Click="MuteButton_Click"/>
</Grid>
</UserControl>
Nun die Sache ist die, databinding arbeitet korrekt, wenn ich in Bewegung bin mein regler(das Modell wird aktualisiert, wenn ich mich bewege die Schieberegler).
Jedoch, wenn auf eine Schaltfläche geklickt wird, ändere ich den Wert in das Modell ein und erwartet, dass es um die Ansicht zu aktualisieren.
Folgenden Code:
private void MuteButton_Click(object sender, RoutedEventArgs e)
{
musicPlayerModel.Volume = 0;
}
Code in Modell:
public double Volume
{
get { return this.volume; }
set
{
this.volume = value;
this.OnPropertyChanged("SomeTestText");
this.OnPropertyChanged("Volume");
}
}
Aber in OnPropertyChanged, wird das Ereignis null ist, und deshalb nichts passiert. Warum ist das Ereignis null und nicht, wenn mein slider bewegt und wie es zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht rufen Sie die Veranstaltung direkt. Was du tust, ist richtig, aber nur, wenn die OnPropertyChanged-Methode korrekt implementiert ist. Im Muster wird von Microsoft empfohlen und verwendet, während die BCL, die OnPropertyChanged (und alle OnXXXXEventName) sollte wie folgt Aussehen:
Wenn dies richtig ist, sollten Sie nicht brauchen, um über das Ereignis null etc. Aber dein code zeigt
this.OnPropertyChanged("SomeTestText");
was nicht legal ist. Der string ist kein Gültiger parameter. Nach dem Ereignis, das Muster, das OnPropertyChanged-event sollte so Aussehen, wie oben, das heißt, Sie sollten es nennen, wie folgt:Hinweis: wenn der handler (Ereignis) ist null, dann wird die aufrufende Anwendung wurde nicht registriert, um das Ereignis. Durch den code, diese kann getan werden, mit
somevar.PropertyChanged += handlerMethod
.Edit: über Schieberegler /WPF und Ereignisse
In einem Kommentar darauf hin, dass es "sollte" automatisch gehen. Aber im code oben, Sie nennen
OnPropertyChanged
mit einem string. Wie bereits erwähnt, das ist nicht legal code, weil OnXXX-Methoden sollte einen parameter, die erbt vonEventArgs
. Obwohl ich als einen normalen PropertyChanged-Ereignis in deinem Fall, XAML-und WPF-gab Raum für eine andere interpretation (sorry für erst jetzt).Du (und ich) im Irrtum über eine Sache. Diese Zitat von MSDN erklärt, dass:
Was Sie tun müssen, um in den code, wo Sie überschreiben Sie die Volume-Eigenschaft, sollten Sie rufen
PropertyChangedCallback
statt, oder verwenden Sie Ihre OnXXX-code mit dem als parameter ein DependencyPropertyChangedEventArgs Struktur. Wenn Sie mich Fragen, Ihren aktuellen Ansatz ist einfacher, auch wenn Sie nicht die original-WPF-Methoden 😉PropertyChanged
Veranstaltungen sind von verschiedenen Arten).