Jestem nowy w mvvm i chciałbym załadować plik rtf w RichTextBox za pomocą mvvm, ale tekst nie wyświetla się w moim richtextbox. Wygląda na to, że RichTextBox jest dość skomplikowany, aby poradzić sobie z próbą umieszczenia poleceń w ViewModel. Nie jestem pewien, gdzie popełniam błąd.Załaduj plik rtf w bindable RichTexBox mvvm wpf
ViewModel
FlowDocument _script;
public FlowDocument Script
{
get { return _script; }
set { _script = value; RaisePropertyChanged("Script"); }
}
.
.
.
private void LoadScript()
{
openFile.InitialDirectory = "C:\\";
if (openFile.ShowDialog() == true)
{
string originalfilename = System.IO.Path.GetFullPath(openFile.FileName);
if (openFile.CheckFileExists)
{
Script = new FlowDocument();
TextRange range = new TextRange(Script.ContentStart, Script.ContentEnd);
FileStream fStream = new FileStream(originalfilename, System.IO.FileMode.OpenOrCreate);
range.Load(fStream, DataFormats.Rtf);
fStream.Close();
}
}
}
View
DataContext="{Binding ScriptBreakdownViewModel, Source={StaticResource Locator}}">
<Grid>
<RichTextBox
Local:RichTextBoxHelper.DocumentRtf="{Binding Script}"
x:Name="rtfMain"
HorizontalAlignment="Left"
Width="673"
VerticalScrollBarVisibility="Visible"
Margin="0,59,0,10.4"
/>
RichTextBoxHelper
public class RichTextBoxHelper : DependencyObject
{
public static string GetDocumentRtf(DependencyObject obj)
{
return (string)obj.GetValue(DocumentRtfProperty);
}
public static void SetDocumentRtf(DependencyObject obj, string value)
{
obj.SetValue(DocumentRtfProperty, value);
}
public static readonly DependencyProperty DocumentRtfProperty =
DependencyProperty.RegisterAttached(
"DocumentRtf",
typeof(string),
typeof(RichTextBoxHelper),
new FrameworkPropertyMetadata
{
BindsTwoWayByDefault = true,
PropertyChangedCallback = (obj, e) =>
{
var richTextBox = (RichTextBox)obj;
// Parse the XAML to a document (or use XamlReader.Parse())
var Rtf = GetDocumentRtf(richTextBox);
var doc = new FlowDocument();
var range = new TextRange(doc.ContentStart, doc.ContentEnd);
range.Load(new MemoryStream(Encoding.UTF8.GetBytes(Rtf)),
DataFormats.Rtf);
// Set the document
richTextBox.Document = doc;
// When the document changes update the source
range.Changed += (obj2, e2) =>
{
if (richTextBox.Document == doc)
{
MemoryStream buffer = new MemoryStream();
range.Save(buffer, DataFormats.Rtf);
SetDocumentRtf(richTextBox,
Encoding.UTF8.GetString(buffer.ToArray()));
}
};
}
});
}
a model
FlowDocument _script;
public FlowDocument Script // the Name property
{
get { return _script; }
set { _script = value; NotifyPropertyChanged("Script"); }
}
to ci pomaga w jakikolwiek sposób? http://www.codeproject.com/Articles/137209/Binding-and-styling-text-to-a-RichTextBox-in-WPF – niksofteng
Czy twoja metoda "LoadScript" w ViewModel na pewno jest wywoływana? –