2010-11-20 5 views
3

Ich habe eine TabControl gebunden an eine ICollectionView mit abgeleitet von ObservableCollection<EditorTabViewModel>. Ich denke ziemlich Standard MVVM Multi-Dokument-Muster? Wie auch immer, EditorTabViewModel hat eine Eigenschaft Content, die die anzuzeigende Zeichenfolge enthält. Ich finde, dass die Bindung funktioniert ...Bindung bindet nicht?

// Add 2 default tabs for a test, also set their Content property to the respective values ... 
_tabs.Add(new EditorTabViewModel { Content = "Tab 1" }); 
_tabs.Add(new EditorTabViewModel { Content = "Tab 2" }); 

Seine Werte korrekt

XAML

<!-- DataTemplate to render EditorTabViewModels --> 
<DataTemplate DataType="{x:Type vm:EditorTabViewModel}"> 
    <me:MarkdownEditor 
     TextContent="{Binding Path=Content.Content, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=TwoWay}" 
     Options="{Binding Path=Options, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
</DataTemplate> 

Ergebnis

gerendert werden

Aber wenn ich den Wert, Schalter Tabs und Rückkehr zu ändern, erhalte ich die im Konstruktor gesetzt Zeichenfolge wieder ... in this video (on screenr)

Die Visual Studio Solution

+0

Mediafire erlaubt mir nicht, die Quellen herunterzuladen. Vermutlich, weil viele Leute aus meiner Region gerade versuchen, etwas davon herunterzuladen. –

Antwort

0

Ändern Sie den UpdateSourceTrigger in PropertyChanged für die TextBox "txtEditor" in MarkdownEditor.xaml. Der Standardwert UpdateSourceTrigger für eine TextBox ist LostFocus und dieses Ereignis wird beim Ändern der Registerkarte nie ausgelöst. Aus diesem Grund wird auf den vorherigen Wert zurückgesetzt

<TextBox Grid.Row="1" x:Name="txtEditor" AcceptsReturn="True" 
     Text="{Binding TextContent, UpdateSourceTrigger=PropertyChanged}" 
     FontFamily="{Binding Path=Options.FontFamily}" 
     FontSize="{Binding Path=Options.FontSize}" 
     FontWeight="{Binding Path=Options.FontWeight}" 
     Background="{Binding Path=Options.Background}" 
     Foreground="{Binding Path=Options.Foreground}" /> 
+0

Ich bin mir zwar nicht sicher, aber diese Lösung kann zu einem hohen Speicherverbrauch führen. Sie werden bei jeder Textänderung im 'txtEditor' eine neue Zeichenfolge zuweisen. Für kurze Texte ist es erschwinglich, aber nicht für den Dokumenteneditor. Es ist besser, sich an LostFocus Event oder etwas zu hängen. –

+0

@ alpha-mouse Aufgrund der Funktionsweise des .NET-Garbage Collectors ist das Erstellen großer (großer!) Zahlen kleiner, kurzlebiger Objekte wie Strings selten ein Problem. – Bevan

+0

@Bevan: Wir sprechen hier über Texteditor. Also werden diese Strings nicht besonders _small_ sein. –

0

ich, dass MarkdownEditor.TextContent Eigenschaft annehmen werde gezeigt sagt niemandem, dass sein Wert geändert wurde, so dass der Bindemechanismus sich nicht darum bemüht, seinen neuen Wert auf EditorTabViewModel.Content zu schreiben. Wenn TextContent eine Abhängigkeitseigenschaft von MarkdownEditor ist, können Sie sicherstellen, dass es geänderten Text von dem Steuerelement erhält, das Sie verwenden, um Text tatsächlich zu bearbeiten (TextBox oder etwas)?