我真的很难让文本框绑定到字符串变量,并且在互联网上尝试了各种解决方案,但没有成功。也许有人可以指出我做错了什么?
Xaml
<Border Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="3" CornerRadius="5" BorderBrush="{StaticResource SteelBlue}" BorderThickness="1" Opacity="0.8">
<TextBox Style="{StaticResource TCGTextBox}" Text="{Binding ProgramManager.ProgramName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" GotFocus="TCG_TB_Focused" CornerRadius="0" LostFocus="TCG_TB_UnFocused" x:Name="TCG_TestProgramName" ></TextBox>
</Border>
ProgramManager 是在我的 MainWindow.xaml.cs 文件中声明的
TestPrograms ProgramManager = new TestPrograms();
C#
public class TestPrograms : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public int Selected_Test = 0;
private string _ProgramName = string.Empty;
public string ProgramName
{
get => _ProgramName;
set
{
_ProgramName = value;
NotifyPropertyChanged();
}
}
public void LoadTestProgram(TestProgramsViewModel program)
{
ProgramName = program.Test_Name;
}
}
每当我调用 LoadTestProgram() 时,_ProgramName 都会正确更新,但 UI 不会更新。我尝试过使用静态变量并使用 x:Bind 来执行此操作,但仍然无法使其工作。对此表示赞赏并提供帮助。
所以,正如上面0x436f提到的,我没有设置数据上下文。为此,我在 XAML 中编辑了以下内容。
<Border x:Name="ROOTPANEL" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="3" CornerRadius="5" BorderBrush="{StaticResource SteelBlue}" BorderThickness="1" Opacity="0.8">
<TextBox Style="{StaticResource TCGTextBox}" Text="{Binding ProgramManager.ProgramName, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" GotFocus="TCG_TB_Focused" CornerRadius="0" LostFocus="TCG_TB_UnFocused" x:Name="TCG_TestProgramName" ></TextBox>
</Border>
向边框元素添加名称,在本例中将其称为 ROOTPANEL。
然后我将 ROOTPANEL 的数据上下文设置为正确的 ViewModel。
TCGRootPanel.DataContext = ProgramManager;
注意,ROOTPANEL 可以位于树视图的更高位置,以便捕获更多子元素(如果它们都访问同一虚拟机)。