访问WPF中的用户控件

时间:2013-11-27 23:07:18

标签: c# wpf xaml user-controls

我刚开始使用WPF已经使用了WinForms一段时间,并且似乎已经陷入了第一道障碍。

我的主要XAML定义为

  <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中,我看到我可以从主XAML文件中引用名为body的RichTextBox。但是我不能在UserControl中引用名为“bbstatusbar”的TextBlock。

如何从MainWindow.xaml.cs设置TextBlock的值?

1 个答案:

答案 0 :(得分:3)

与Vlad和HighCore的评论一致:您没有从MainWindow.xaml.cs设置TextBlock。您将它绑定到视图模型。绑定看起来像这样:

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

上面说过:将Text属性绑定到当前数据上下文中名为“StatusText”的属性。接下来,创建一个视图模型:

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

    // TODO implement INotifyPropertyChanged
} 

最后,将MainPage的DataContext设置为视图模型。您可以通过多种方式执行此操作,但为简单起见,请在构造函数中执行此操作:

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

现在,我们的想法是将与模型相关的逻辑放入ViewModel。因此,您不需要访问UI元素 - 而是更新UI元素绑定的视图模型属性。