2016-07-22 7 views
0

Ich habe diesen Code, wo ich das Bild in meinem Hauptfenster aktualisieren möchte, wenn sich die Eigenschaft in einem Benutzersteuerelement ändert. Aber irgendwie kann ich den Auslöser nicht arbeiten lassen.WPF - Klasseneigenschaft als Datenauslöser

Einige der XAML-Code

<StatusBar MinHeight="10" MaxHeight="20" VerticalAlignment="Bottom" Grid.Row="2"> 
    <Image x:Name="SomeNameHere"> 
     <Image.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=pingable}" Value="false"> 
         <Setter Property="Image.Source" Value="Icons/MainWindow/StatusOffline_stop_32x.png"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=pingable}" Value="true"> 
         <Setter Property="Image.Source" Value="Icons/MainWindow/StatusOK_32x.png"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Image.Style> 
    </Image> 
</StatusBar> 

Der Teil, wo die Eigenschaft kommt von

public bool pingable { get; set; } 

public MainWindow() 
{ 
    InitializeComponent(); 
    pingable = PingHost("some random IP"); 
} 

public bool PingHost(string nameOrAddress) 
{ 
    pingable = false; 
    Ping pinger = new Ping(); 
    try 
    { 
     PingReply reply = pinger.Send(nameOrAddress); 
     pingable = reply.Status == IPStatus.Success; 
    } 
    catch (PingException) 
    { 
     // Discard PingExceptions and return false; 
    } 
    return pingable; 
} 

ich die Eigenschaft während der Fehlersuche im XAML-Editor zu sehen, so dass es scheinbar erkannt wird, und ich sehe auch die Wert würde passen. Aber irgendwie wird der Setter nicht ausgeführt. Jemand eine Idee zu diesem Thema?

Vielen Dank und einen schönen Tag!

Antwort

1

Sie müssen Ihr PropertyChanged Ereignis auf pingable erhöhen, damit die Ansicht aktualisiert wird.

Im Grunde muss Ihr Ansichtsmodell INotifyPropertyChanged implementieren, damit die Ansicht weiß, dass es einige auf einer Bindung basierende Steuerelemente aktualisieren muss. Jedes Mal, wenn Sie die Ansicht basierend auf einer Änderung im Ansichtsmodell aktualisieren möchten, müssen Sie PropertyChanged aus dem Ansichtsmodell auslösen und den Namen der gebundenen Eigenschaft übergeben, deren Wert aktualisiert wurde.

+0

Dank Ihnen. Das hat mir wirklich sehr geholfen. Werde eine Antwort schreiben mit wie ich es am Ende ein wenig gehandhabt habe. – CuttingWide

0

Wenn Sie RaisePropertyChanged für Getter und Setter ausführen, wird das XAML benachrichtigt, wenn sich die Eigenschaft ändert, und die Trigger werden ausgelöst. Versuchen Sie diesen Code:

bool _pingable; 
public bool pingable 
{ 
    get{return _pingable;} 
    set{ _pingable = value; RaisePropertyChanged;} 
}; 
0

Während die beiden anderen Antworten vor meinen weisen darauf hin, dass INotifyPropertyChanged Bedürfnisse umgesetzt werden - und das ist ziemlich wichtig für eine normale Anwendung WPF - ich glaube nicht, dass hier eigentlich ankommt . Ihre Ping-Anfrage sieht synchron aus, so dass die UI bei der Aktualisierung Ihres Wertes nicht geladen wird, wodurch INotifyPropertyChanged irrelevant wird.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     Thread.Sleep(2000); // pretending to ping 
     Flag = true; 
    } 

    public bool Flag { get; set; } 
} 

XAML:

<Grid> 
    <CheckBox IsChecked="{Binding Flag}" /> 
</Grid> 

Diese Option ist aktiviert, wenn das Fenster schließlich Lasten. Wenn dies asynchron wäre, wäre das eine andere Geschichte.

Ich sehe die Eigenschaft während des Debuggens im XAML-Editor

Ich bin nicht sicher, was das bedeutet. Ich vermute, das eigentliche Problem hier ist, dass Sie keinen DataContext definiert haben. (Vielleicht ist es, aber ich kann es nicht hier sehen!)

Sie die Eigenschaft erstellt haben auf dem Fenster selbst, also ... was ist, wenn Sie Ihre Trigger geschaltet zu sein ...

<DataTrigger Binding="{Binding Path=pingable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Value="false">