Поведение связывания C # WPF - PullRequest
1 голос
/ 07 января 2011

Я достаточно опытный программист, но новичок в WPF.Я связал текстовый блок в форме со свойством объекта, но он не обновляет форму, как я ожидал, когда я установил свойство.Привязка, кажется, выполнена правильно - если я устраняю неполадки с кнопкой, которая обновляет свойство, форма изменяется, но когда я первоначально устанавливаю свойство в конструкторе формы, анализируя локальный файл XML, он не обновляется.

Я использую C # и VS2010.Может ли кто-нибудь наставить меня на несколько шагов или направить меня к книге или инструменту кодирования, который поможет мне преодолеть этот горб?Кроме того, обратите внимание, что я решил структурировать вещи, имитируя парадигму, использованную в разделе «Как мне: создать мое первое приложение WPF» на windowsclient.net.Если вы думаете, что я поступаю неправильно, я был бы признателен за указание на лучший учебник.

Форма 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 ]

5 голосов
/ 07 января 2011

У вас есть два экземпляра myConfigurationViewModel.Один создается внутри XAML, а второй - внутри кода формы.Вы вызываете LoadConfiguration для объекта в коде, который никогда не задается как DataContext формы.

Удалите это из XAML:

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

и измените конструктор следующим:1006 *

public MyForm()
{
    mcvm.LoadConfiguration();    
    DataContext = mcvm;
}   
0 голосов
/ 07 января 2011

Можете ли вы попробовать этот 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;
  }

[Обновить] Неправильно в объяснении, удалил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...