C#WPF绑定行为

时间:2011-01-07 18:46:21

标签: c# wpf binding

我是一位经验丰富的程序员,但对WPF来说是新手。我已将表单上的文本块绑定到对象属性,但它没有像我在设置属性时所期望的那样更新表单。绑定似乎正确完成 - 如果我使用更新表单更改属性的按钮进行故障排除,但是当我最初通过解析本地XML文件在表单的构造函数中设置属性时,它不会更新。

我正在使用C#和VS2010。有人可以指导我做几个步骤,或者引用我的书或编码工具,让我超过这个驼峰。另外,请注意我选择通过在windowsclient.net上模仿“我如何:构建我的第一个WPF应用程序”中使用的范例来构建方式。如果您认为我的方法不对,我会很感激指向更好的教程。

表格XAML:

<Window ...
  xmlns:vm="clr-namespace:MyProjectWPF.ViewModels">
  <Grid>
    <Grid.DataContext>
      <vm:MyConfigurationViewModel />
    </Grid.DataContext>

    <TextBlock Name="textBlock4" Text="{Binding Path=Database}" />
  </Grid>

MyConfigurationViewModel类定义:

class MyConfigurationViewModel : INotifyPropertyChanged
{
  private string _Database;

  public string Database
  {
    get { return _Database; }
    set { _Database = value; OnPropertyChanged("Database"); }
  }

  public void LoadConfiguration()
  {
    XmlDocument myConfiguration = new XmlDocument();
    myConfiguration.Load("myfile.xml");
    XmlNode root = myConfiguration.DocumentElement;

    Database = root["Database"].InnerText;
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void OnPropertyChanged(string Property)
  {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(Property));
  }

我的XAML形式背后的代码:

public partial class MyForm : Window
{
  private ViewModels.myConfigurationViewModel mcvm
    = new ViewModels.myConfigurationViewModel();

  public MyForm()
  {
    mcvm.LoadConfiguration();
  }

2 个答案:

答案 0 :(得分:5)

您有两个myConfigurationViewModel实例。一个是在XAML中创建的,第二个是在表单的代码隐藏中创建的。您正在调用后面代码中的LoadConfiguration,它永远不会被设置为表单的DataContext。

从XAML中删除它:

<Grid.DataContext>       
    <vm:MyConfigurationViewModel />
</Grid.DataContext> 

并将构造函数更改为:

public MyForm()
{
    mcvm.LoadConfiguration();    
    DataContext = mcvm;
}   

答案 1 :(得分:0)

你能试试这个XAML:

<Window ...
 xmlns:vm="clr-namespace:MyProjectWPF.ViewModels">
<Grid>

    <TextBlock Name="textBlock4" Text="{Binding Path=Database}" />
</Grid>

使用此代码:

public partial class MyForm : Window
{
  private ViewModels.myConfigurationViewModel mcvm = new ViewModels.myConfigurationViewModel();

  public MyForm()
  {
    mcvm.LoadConfiguration();
    this.DataContext = mcvm;
  }

[更新] 解释错误,将其删除。