2009-02-16 4 views
5

Ich habe zwei Projekte. Der eine arbeitet und der andere nicht, aber die Unterschiede zwischen ihnen sind nichts, was ich für "wichtig" halte. Das erste Projekt ist das, das gebrochen ist und es ist das, das ich versuche zu beheben. Das zweite Projekt ist ein kleines Beispielprojekt, das ich erstellt habe, wenn das erste Projekt überhaupt nicht funktioniert. Natürlich funktioniert das Beispiel perfekt. HierCombobox nicht richtig an SelectedItem binden

ist die Ansicht für das erste Projekt. Ich habe eine Reihe von "MainWindowTabControlStyle" entfernt, weil nur das Kombinationsfeld kaputt ist. Ich bin mir sicher, dass das Problem nicht im Stil liegt, weil es ein Kopieren und Einfügen aus dem Projekt ist, das funktioniert.

Hier ist das Ansichtsmodell, das auf den DataContext des MainWindow festgelegt ist. Die ViewModelBase-Klasse ist genau derselbe Code, den Josh Smith in diesem MSDN-Artikel dieses Monats geschrieben hat.

public sealed class MainWindowViewModel : ViewModelBase 
{ 
    public MainWindowViewModel() 
    { 
    } 

    private ObservableCollection<Subscription> subscriptions; 
    public ObservableCollection<Subscription> Subscriptions 
    { 
     get 
     { 
      if (subscriptions == null) 
      { 
       subscriptions = new ObservableCollection<Subscription>(); 
       subscriptions.Add(new Subscription() { DisplayName = "ABC" }); 
       subscriptions.Add(new Subscription() { DisplayName = "XYZ" }); 
       subscriptions.Add(new Subscription() { DisplayName = "PDQ" }); 
      } 

      return subscriptions; 
     } 
     set { subscriptions = value; } 
    } 

    private Subscription selectedSubscription; 
    public Subscription SelectedSubscription 
    { 
     get { return selectedSubscription; } 
     set { selectedSubscription = value; } 
    } 
} 

Als ich das Projekt von dem Debugger das erste Think ausführen, ist der Getter für die Abonnements Sammlung genannt wird. Dann wird der Setter bei SelectedSubscription aufgerufen (es ist null). Danach kann ich das ausgewählte Element in der Combobox ändern, bis ich im Gesicht blau bin und der Setter für die SelectedSubscription -Eigenschaft nicht wieder geändert wird. Es ist wichtig zu beachten, dass die Combobox die richtigen Werte enthält. Im zweiten Projekt ist der Code identisch, aber das erste, was aufgerufen wird, ist der Setter für die SelectedSubscription -Eigenschaft (es ist null), dann wird der Getter für die Subskriptions-Sammlung aufgerufen und schließlich wird der Setter für die SelectedSubscription mit a bezeichnet das zweite Mal und es hat einen Wert, der dem ersten Element in der Subskriptionsauflistung entspricht.

Dieses kleine Juwel hat mich kosten ca. 5 Stunden, wenn Sie irgendwelche Ideen überhaupt haben ich bin bereit, es zu versuchen.

Dank

Antwort

0

Entschuldigung wegen der Verzögerung bei der Antwort. Es gab eine Art Problem, eine Open ID zu installieren.

Dies ist ein ernsthaft seltsames Problem.

Die Lösung für dieses Problem kam überhaupt nicht aus dem Fenster. Bevor die show -Methode des Fensters aufgerufen wurde, gab es ein weiteres Fenster, das als Dialog geöffnet wurde. In diesem Dialog gab es die folgenden Ressourcen

<Window.Resources> 
    <DropShadowBitmapEffect x:Key="DropShadowEffect" Noise="0" Opacity="0.45" ShadowDepth="5" Softness="0.25"/> 
</Window.Resources> 

Es wurde von zwei Textblöcken im selben Fenster als „Dynamic“ verwiesen wird. Nach dem Ausschalten des Dialogs und dem Starten der Anwendung mit den Fenstern, in denen das Problem aufgetreten ist, wurde festgestellt, dass das Problem durch das Dialogfenster verursacht wurde. Während ich das Thema recherchierte, schlug ein Kollege vor, dass ich die DynamicResource in eine StaticResource verwandle, weil es keinen Grund dafür gab, dass sie dynamisch war.

Diese Änderung in einem Dialogfenster mit einer Ressource, die nur im Rahmen des Dialogfensters verfügbar war, behob das oben beschriebene Bindeproblem im "Hauptfenster". Ich nehme an, dass seltsame Dinge passieren können.

1

Möglicherweise

SelectedItem="{Binding Path=SelectedSubscription, Mode=OneWayToSource}" 

zu

SelectedItem="{Binding Path=SelectedSubscription, Mode=TwoWay}" 
+1

Versucht, dass es aber nicht funktioniert. Eines der Dinge, die ich im ursprünglichen Beitrag hervorheben wollte, ist, dass ich ein anderes Projekt mit genau dem gleichen View- und ViewModel ... kopiere und hinter Zeile für Zeile habe. Das andere Projekt funktioniert gut. –

+0

Eigentlich, nachdem ich geschrieben habe, dass ich anfing, verbindliche Probleme mit einer Silverlight Combobox zu bekommen, ist es vielleicht ansteckend. – geofftnz

0

Der richtige Weg, dies zu debuggen ändern, ist das Arbeitsprojekt zu nehmen und abwechselnd (ändern es gebrochen Code übereinstimmen/bestätigen es funktioniert), bis es entweder identisch mit dem abgebrochenen Projekt ist oder es bricht. Der Punkt, an dem es bricht, sagt Ihnen, wo das Problem liegt. Das beschädigte Projekt zu ändern ist normalerweise ein verlorener Grund.

Als Neben Punkt, ich würde empfehlen, den Namespace System.Diagnostics zu XAML hinzufügen. Es werden Fehler im Visual Studio-Ausgabefenster angezeigt.

xmlns:debug="clr-namespace:System.Diagnostics;assembly=WindowsBase" 

Als möglicherweise im Zusammenhang Punkt (in, dass es nicht wirklich klar, was das Problem im gebrochenen Projekt ist), können Sie einen Blick auf this StackOverflow question („Combobox controling tabcontrol“), die damit zusammenhängt:

  • WPF,
  • Comboboxen,
  • TabControls und
  • Bindung zwischen ihnen SelectedIndex verwenden.

Es gibt noch keine Lösung für diese Frage, aber es ist ein einfacheres Problem.

Schließlich ist Josh Smith's MSDN code ziemlich groß. Es ist schwer herauszufinden, was Sie geändert haben, um Ihre ComboBox hinzuzufügen, ohne den gesamten Code zu sehen.