StarSoul

学历代表过去,能力代表现在,学习力代表未来!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对于绑定XML文件的存储

Posted on 2011-08-03 18:40  StarSoul  阅读(362)  评论(0)    收藏  举报

XAML中绑定XML数据源有两种方式:一种是在XAML中嵌入XML数据,这叫做XML Island,另一种是XML作为文件独立存在。XML岛屿一般用于静态XML数据场合,若用户需要对XML进行修改,XML岛屿显然无法将用户修改的结果保留起来,就必须使用XML文件。这里是一个简单示例:

XML文件格式如下:

<?xml version="1.0" encoding="utf-8"?>
<LogConfiguration>
<!--Log Output Path-->
<Output>C:\log</Output>
</LogConfiguration>
接下来,使用WPF的XAML语言来创建界面,访问该数据源。对数据源的调用我放在<Window.Resources>中。通过<XmlDataProvider>标记,实现对XML数据源的调用,x:Key是资源的引用的ID,Source是XML资源文件路径,XPath指出XML文件内部数据存放的路径。 
<Window x:Class="WpfXmlBinding.MainWindow"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title
="MainWindow" Height="144" Width="375">
<Window.Resources>
<XmlDataProvider x:Key="xmlLogSetting" Source="pack://siteoforigin:,,,/LogSetting.xml" XPath="LogConfiguration" />
</Window.Resources>
<Grid DataContext="{StaticResource xmlLogSetting}">
<TextBlock Height="23" HorizontalAlignment="Left" Margin="12,28,0,0" Name="textBlock1" Text="Log output path:" VerticalAlignment="Top" />
<TextBox Height="24" HorizontalAlignment="Left" Margin="125,27,0,0" Name="textBox1" VerticalAlignment="Top" Width="137" Text="{Binding XPath=Output}"/>
<Button Content="Browse" Height="23" HorizontalAlignment="Left" Margin="268,28,0,0" Name="btnBrowse" VerticalAlignment="Top" Width="75" Click="btnBrowse_Click" />
<Button Content="Save" Height="23" HorizontalAlignment="Left" Margin="134,70,0,0" Name="btnSave" VerticalAlignment="Top" Width="75" Click="btnSave_Click" />
</Grid>
</Window>

通过以上设置,用户界面与XML数据文件绑定结束,界面显示如下:

我们可以在Text中直接修改输出路径或通过"Browse"按钮选择一个文件夹,在"Save"按钮的点击事件处理程序中,存储修改的结果,代码如下:

View Code
private void btnBrowse_Click(object sender, RoutedEventArgs e)
{
System.Windows.Forms.FolderBrowserDialog folderBrowserDialog
= new System.Windows.Forms.FolderBrowserDialog();

System.Windows.Forms.DialogResult result
= folderBrowserDialog.ShowDialog();

if (result == System.Windows.Forms.DialogResult.OK)
{
textBox1.Text
= folderBrowserDialog.SelectedPath;
}
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
XmlDataProvider logsettingData
= this.FindResource("xmlLogSetting") as XmlDataProvider;
logsettingData.Document.Save(
"LogSetting.xml");
}

结果发现,直接在Textbox修改的路径,保存XML文件没有问题,而通过"Browse"按钮选择的路径,修改结果没有保存到XML文件。    

原因:用户输入传递到数据源对象的时刻是由相应控件绑定时的UpdateSourceTrigger来决定的,其值有三种:

PropertyChanged:当绑定目标属性更改时,立即更新绑定源。

LostFocus:当绑定目标元素失去焦点时,更新绑定源。

Explicit:仅在调用 UpdateSource 方法时更新绑定源。 

对大多数依赖属性而言,默认的绑定时刻是在属性改变时发生的(PropertyChanged),而Text属性则是在失去输入焦点时发生的(LostFocus)。由于我们点击"Browse"按钮时,直接在后台为TextBox的Text属性赋值,然后直接点击"Save",这个过程中TextBox没有失去焦点的事件发生,所以也就无法更新绑定源。

综上所述,修改这个问题有两种方法:

1、指定TextBox绑定的UpdateSourceTrigger为PropertyChanged。

<TextBox Height="24" HorizontalAlignment="Left" Margin="125,27,0,0" Name="textBox1" VerticalAlignment="Top" Width="137" Text="{Binding XPath=Output,UpdateSourceTrigger=PropertyChanged}"/>

2、在"Browse"按钮选择后,设置焦点到TextBox里。

if (result == System.Windows.Forms.DialogResult.OK)
{
textBox1.Text
= folderBrowserDialog.SelectedPath;
textBox1.Focus();
}