2011-01-07 2 views
1

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

Я использую 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(); 
    } 

ответ

5

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

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

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

и изменить конструктор для этого:

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

Спасибо. Исправление кода отлично работало, и объяснение в верхней части было тем, что мне нужно было понять, почему изменения не пробивались в мою форму. – LikeMaBell

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; 
    } 

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

+0

Это * * привязано к реальному экземпляру ... это просто не тот экземпляр, который используется в кодировке –