2013-11-27 3 views
2

Я только начинаю с WPF, использующего WinForms в течение некоторого времени и, похоже, упал при первом препятствии.Доступ к Usercontrols в WPF

У меня есть главный XAMLdefined, как

<Window x:Class="FHIRCDALoader.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:FHIRCDALoader.xaml" 
     Title="FHIR CDA Loader" Height="350" Width="525" 
     Icon="Icons/color_swatch.png"> 

    <Window.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.New" 
         Executed="NewDocument" /> 
    </Window.CommandBindings> 

    <DockPanel> 
     <local:menubar DockPanel.Dock="Top"/> 
     <local:toolbar DockPanel.Dock="Top"/> 

     <local:statusbar DockPanel.Dock="Bottom" /> 

     <RichTextBox x:Name="Body"/> 

    </DockPanel> 


</Window> 

Обратите внимание на использование пользовательских элементов управления, один из которых является «статусной»

<UserControl x:Class="FHIRCDALoader.xaml.statusbar" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StatusBar > 
     <StatusBarItem> 
      <TextBlock x:Name="bbstatusbar" /> 
     </StatusBarItem> 
    </StatusBar> 
</UserControl> 

Так в MainWindow.xaml.cs я вижу, может ссылаться на RichTextBox с именем body из основного файла XAML. Однако я не могу ссылаться на TextBlock в UserControl, который называется «bbstatusbar».

Как установить значение TextBlock из MainWindow.xaml.cs?

+2

Обычно предпочтительным способом является использование MVVM: (1) вы определяете модели представления для своего основного окна и управления, (2) вы привязываете значение текста текстового поля к соответствующему свойству зависимостей в модели представления usercontrol, (3) вы получаете доступ к связанному свойству из основной модели представления. – Vlad

+1

Изучите MVVM. Пожалуйста, внимательно прочитайте [это] (http://stackoverflow.com/a/15684569/643085). Вы не получаете доступ к пользовательскому интерфейсу в WPF для извлечения/установки данных просто потому, что [UI не является данным] (http://stackoverflow.com/a/14382137/643085) –

ответ

3

По соглашению с комментариями Влада и Хайкора: вы не устанавливаете TextBlock из MainWindow.xaml.cs. Вы привязываете его к модели представления. Привязка просто выглядит следующим образом:

<TextBlock Text="{Binding StatusText}" /> 

выше говорит: связать свойство Text к свойству в текущих данных контекст называется «его статус». Далее создайте модель представления:

public class ViewModel : INotifyPropertyChanged 
{ 
    public string StatusText 
    { 
     get { return _statusText; } 
     set 
     { 
      _statusText = value; 
      RaisePropertyChanged("StatusText"); 
     } 
    } 

    // TODO implement INotifyPropertyChanged 
} 

Наконец, установите DataContext вашего MainPage к модели представления. Вы можете сделать это различными способами, но, скажем, здесь для простоты, сделать это в конструкторе:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new ViewModel { StatusText = "hello world" }; 
} 

Теперь, идея заключается в том, чтобы поставить модель связанной логики в ViewModel. Таким образом, вам не нужно будет обращаться к элементам пользовательского интерфейса - вместо этого обновите свойства модели представления, к которым привязаны элементы пользовательского интерфейса.

Смежные вопросы