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>
<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:当绑定目标属性更改时,立即更新绑定源。
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();
}

浙公网安备 33010602011771号