gpt4 book ai didi

c# - 使用MVVM时,XamlWriter可以读取文本框内容吗?

转载 作者:行者123 更新时间:2023-12-03 10:59:34 25 4
gpt4 key购买 nike

我一直在到处搜索。就像标题所说的那样,XamlWriter是否可以读取文本框的内容以及文本框本身的定义?

文本框未在运行时直接输入Xaml,因为它们已绑定(bind)到MVVM模式。目前,XamlWriter仅保存文本框而没有其内容。

保存 View 的示例代码,但是而没有文本框内容:

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代码,它仍然没有保存文本框内容,这是因为它们已绑定(bind)(这是我研究的内容)

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>

最佳答案

我只是不明白您的意思……您来到此网站并寻求有用的建议,而当您获得有用的建议时,您将其忽略,并一次又一次地问您(实际上是相同的)问题。几个不同的用户已经告诉您,在WPF中,我们使用数据而不是UI控件。因此,与其保存TextBox es及其所有对您而言毫无意义的额外属性,不如将正义文本保存在绑定(bind)到TextBox es的集合数据中。

现在,我希望您不要再将其当作个人了,但是在某个时候,您必须开始倾听那些知道他们在说什么的人。但是,如果您决心以自己的固执方式(而不是正确的方式)执行此操作,那么我可以请您注意MSDN上的XamlWriter Class页面:

The serialization enabled by this method has a series of limitations. This is because the serialization enabled is explicitly run-time, and does not have access to possible design-time information in the original XAML (if any). For details, see Serialization Limitations of XamlWriter.Save.



从MSDN上的链接页面:

Common references to objects made by various markup extension formats, such as StaticResource or Binding, will be dereferenced by the serialization process. These were already dereferenced at the time that in-memory objects were created by the application runtime, and the Save logic does not revisit the original XAML to restore such references to the serialized output. This potentially freezes any databound or resource obtained value to be the value last used by the run-time representation, with only limited or indirect ability to distinguish such a value from any other value set locally.



我突出显示了一个部分,该部分基本上说是的,您可以使用 XamlWriter.Save方法保存控件的属性值。但是,我无法告诉您为什么不保存您的值。

现在,当您说您到处搜索时,您似乎错过了针对您的问题的最明显的搜索词: XamlWriter Class。供您将来引用,如果您用这些词进行搜索,那么您会在所有结果中找到所有这些。

但是,保存数据而不是UI控件更有意义。考虑一下...您已经具有从集合中生成/显示这些 TextBox es的机制,那么为什么不使用它呢?将数据保存到数据库或文本文件中,然后在重新加载数据时,使用现有代码从集合中重新填充 TextBox。这真的很简单,就像用加载的数据填充 View 模型中的集合一样。您甚至可以使用几乎已经使用的甚至相同的代码来保存数据收集。

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

除了其他方面,持久保存数据而不是UI控件要容易得多。

最后,您是否注意到直到现在您的(非常相似的)问题尚未得到解答?您是否看到这里通常立即回答大多数问题?我不是唯一注意到您所有非常相似的问题的人,这向您表明,当用户因期望别人为他们做所有工作而滥用此网站时,整个StackOverflow社区都不喜欢它。

现在您可能不会相信,就像我们之前“冲突”一样,但是所有这些建议都旨在为您提供帮助。抱歉,如果我的任何评论冒犯了您,但是如果您根据 the rules使用此站点,那么您将获得更多好处。例如,不要一遍又一遍地问相同的问题,只需编辑原始问题 if you didn't get a satisfactory answer即可。已编辑的问题会再次发回到未答复队列的顶部,以吸引更多关注。

希望您这次接受我的建议,并希望您的项目做得好。

更新>>>

MSDN的链接页面向我们表明XamlWriter可以保存数据绑定(bind)的数据,但是不幸的是,我无法告诉您您的为什么不起作用。

老实说,仅保存 string是不够的。您需要保存所有相关数据。显示,编辑和保存此数据的最简单方法是创建实现 INotifyPropertyChanged接口(interface)的自定义类。例如,对于您的情况,我将创建一个类似于 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字段来支持这些公共(public)属性...这只是一个简化的示例。注意 SerializableAttribute的使用...这将使您仅用几行代码即可保存数据。

您可以根据需要构造属性,但想法是将所有相关数据封装到一个类中。然后,您可以为该类类型提供 DataTemplate,我们将其称为 Template,并定义将显示相关属性值的控件的集合。

现在好了……您可以在 View 模型中创建该类型的集合……:
public ObservableCollection<Question> Questions { get; set; }

...,然后将任何集合控件的 ItemTemplate属性设置为 DataTemplate:
<ListBox ItemsSource="{Binding Questions}" ItemTemplate="{StaticResource Template}" />

然后该集合中的每个 Question项都将按照您在 DataTemplate中定义的完全呈现出来。因此,要回答有关如何重新加载数据的问题,只需在 View 模型中重新填充 Questions集合,WPF模板系统将以与该数据之前完全相同的方式为我们正确填充UI。已保存。

现在,您可以看到...我已经花了很多时间向您解释这一切。我相信您可以回答关于使用新发现的搜索技巧可能遇到的任何其他问题。

首先,这里有一些有用的文章:

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

关于c# - 使用MVVM时,XamlWriter可以读取文本框内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21021990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com