2014-01-09 37 views
0

我一直在寻找这个。正如标题所说,有没有办法让XamlWriter阅读文本框的内容以及文本框本身的定义?使用MVVM时,XamlWriter可以读取文本框内容吗?

的文本框不直接进入Xaml,因为他们已经绑定到MVVM模式,在运行时。目前,XamlWriter只是保存没有内容的文本框。

示例代码保存视图,但没有文本框的内容:

string mystrXAML = XamlWriter.Save(StackPanelContent); 

     string name = txtname.Text; 

     FileStream fs = File.Create(String.Format(@"C:\Desktop\" + name + ".txt")); 
     StreamWriter sw = new StreamWriter(fs); 
     sw.Write(mystrXAML); 
     sw.Close(); 
     fs.Close(); 

编辑:

已经花了很多的时间去思考和研究如何做到这一点仍然无法找到正确的答案。这是我的XAML代码和它仍然没有保存文本框的内容,这是因为它们绑定(是我研究)

XAML:

<ListView ItemsSource="{Binding Title}" ItemTemplate="{DynamicResource Template}"> 
    <ListView.ItemContainerStyle> 
      <Style> 
       <Setter Property="FrameworkElement.Margin" Value="20,20,0,0"/> 
      </Style> 
    </ListView.ItemContainerStyle> 
      <ListView.Resources> 
       <DataTemplate x:Key="Template"> 
        <TextBox Text="{Binding .}" Width="200" HorizontalAlignment="Left" /> 
       </DataTemplate> 
      </ListView.Resources> 
</ListView> 

<ListView x:Name="QuestionList" ItemsSource="{Binding Question}" ItemTemplate {DynamicResource Template}"> 
     <ListView.ItemContainerStyle> 
      <Style> 
       <Setter Property="FrameworkElement.Margin" Value="40,20,0,0"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
      <ListView.Resources> 
       <DataTemplate x:Key="Template"> 
        <TextBox Text="{Binding .}" Width="200" HorizontalAlignment="Left"/> 
       </DataTemplate> 
      </ListView.Resources> 
</ListView> 

回答

3

我只是不明白你...你来到这个网站并寻求有用的建议,当有用的建议给予你时,你会忽略它并反复询问你的(实际上相同的)问题。你已经被几个不同的用户告知,在WPF中,我们使用数据而不是UI控件。因此,不要将TextBox es保存为对您没有意义的所有额外属性,您应该将正文保存在绑定到TextBox es的收集数据中。

现在我希望你不要再次亲自参与,但是在某些时候,你必须开始倾听那些知道他们在说什么的人。但是,如果你的心脏坐落于自己的固执的方式这样做,而不是正确的方法,那么我可以请你注意的XamlWriter Class页面上MSDN:

通过这种方法启用系列化有一系列的局限性。这是因为启用的序列化是显式运行时的,并且无法访问原始XAML中的可能设计时信息(如果有的话)。有关详情,请参阅Serialization Limitations of XamlWriter.Save

而且从MSDN上的链接页面:

通过各种标记扩展格式,如静态资源或绑定人造物体常见的引用,将被序列化进程解除引用。在应用程序运行时创建内存中的对象时,这些已经被解除引用,并且保存逻辑不会重新访问原始XAML以恢复对序列化输出的此类引用。 这可能会冻结任何数据绑定或资源获取值,使其成为运行时表示上次使用的值,只有有限或间接的能力将此值与本地设置的任何其他值区分开来。

我突出一节,基本上说,是的,你可以使用XamlWriter.Save方法保存控件的属性值。然而,我无法告诉你为什么你的价值观没有被保存。

现在当你说你到处搜索时,你似乎已经错过了你的问题最明显的搜索条件:XamlWriter Class。为了将来的参考,如果你用这些词进行搜索,那么你会发现所有这一切都在最好的结果。

但是,保存数据而不是UI控件才更有意义。考虑一下......你已经有了从你的收藏中生成/显示这些TextBox的机制,那你为什么不使用它呢?将数据保存在数据库或文本文件中,当您重新加载数据时,请使用现有代码重新填充集合中的TextBox es。这实际上与使用加载的数据在视图模型中填充集合一样简单。您甚至可以使用几乎相同的代码保存数据收集,您甚至可以使用相同的代码。

这是如何正确完成的。现在,您可以接受并以正确的方式继续您的项目,或者您可以继续忽略此建议并询问更多几乎相同的问题。现在,我认为这至少是第三个问题,问如何将XAML存储在文件或数据库中。如果你刚才接受了以前给你的好建议,或者甚至进行了适当的搜索,那么你可以节省大量的时间,包括你自己的大量时间。

除了其他任何东西,它只是更容易持久的数据,而不是UI控件。

最后,你注意到你的(非常相似的)问题到现在为止还没有被回答吗?你有没有看到大多数问题通常在这里立即得到解答?我没有注意到你所有的非常类似的问题的唯一的人,这表明你的StackOverflow的社会作为一个整体不喜欢它,当用户通过期望别人做所有他们的工作为他们滥用这个网站。

现在你可能不会相信这个,因为我们之前曾经发生过“冲突”,但所有这些建议都是为了帮助你。道歉,如果我的任何评论冒犯了你,但如果你使用这个网站根据the rules,那么你会得到更多的。例如,不要一再提出同样的问题,只需编辑您的原始问题if you didn't get a satisfactory answer。编辑后的问题再次回到未答复队列的顶部以吸引更多关注。

我希望你能接受我的建议,祝你好运。


UPDATE >>>

从MSDN链接页面显示我们的的XamlWriter 可以保存数据绑定的数据,但不幸的是,我不能告诉你为什么你不工作。

说实话,保存string s是不够的。您需要储存全部的相关数据。显示,编辑保存此数据最简单的方法是创建一个实现INotifyPropertyChanged界面自定义类。例如,对于你的情况,我会创造一个Question类是这样的:

[Serializable] 
public class Question // Implement INotifyPropertyChanged correctly here 
{ 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public string Answer { get; set; } 
} 

如果你的问题是选择题,那么你可以做这样的事情:

[Serializable] 
public class Question // Implement INotifyPropertyChanged correctly here 
{ 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public List<Answer> Answers { get; set; } 
    public Answer CorrectAnswer { get; set; } 
} 

当然,你应该有支持这些公共财产的private字段......这只是一个简单的例子。注意使用SerializableAttribute的...这将使你的数据和代码,只需几行保存。

您可以构建但是你想要的属性,但这个想法是,你封装了所有的相关数据为一类。然后,你可以为该类类型DataTemplate,姑且称之为Template,并定义的,将显示相应的属性值控件的集合。

现在,这里的很大一部分...你可以创建一个该类型的视图模型的集合...:

public ObservableCollection<Question> Questions { get; set; } 

...任何集散控制的ItemTemplate属性设置为您DataTemplate

<ListBox ItemsSource="{Binding Questions}" ItemTemplate="{StaticResource Template}" /> 

,然后集合中的每个Question项目将神奇地完全按照您的定义DataTemplate呈现。因此,要回答关于如何重新加载数据的问题,只需在视图模型中重新填充Questions集合,并且WPF模板系统将按照与在数据之前完全相同的方式正确地为我们重新填充UI被保存了。

现在你可以看到...我已经花了大量时间来给你解释这一切。我相信您可以回答您在新发现的搜索技能方面可能遇到的任何其他问题。

要带您起步,这里有一些有用的文章:

Serialization (C# and Visual Basic)
Walkthrough: Persisting an Object (C# and Visual Basic)
Data Templating Overview
INotifyPropertyChanged Interface

+1

对不起,如果我的反应不好,我知道有些问题我已经发布了很多关于,但我承担的事情是我是一个新的开发人员要求_advice_,而不是让某人为我**代码**。我已阅读完整答案。首先,我认为它没有通过的原因现在文本框的内容是因为绑定了?其次,你救救内容到数据库中,但是当你加载了该浏览一遍,他们如何知道什么文本框获得放回。感谢您的答复。 – user3157821

+0

“开始听的是知道他们在说什么的人。” @谢里登,我可以给你买啤酒吗? – Gusdor

相关问题