我刚开始使用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的值?
答案 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元素绑定的视图模型属性。