【问题标题】:Binding directly to an object property [closed]直接绑定到对象属性[关闭]
【发布时间】:2020-04-17 03:22:19
【问题描述】:

我仍然掌握 WPF 的窍门,而且数据绑定很痛苦。我希望这个文本框绑定到页面的 Exam 对象的 Name 属性。

以下是我平时的做法。

        <StackPanel VerticalAlignment="Center" x:Name="CreateExamStackPanel">
            <TextBox Style="{StaticResource placeHolder}" Tag="Exam Name" 
                     x:Name="NameTextBox" Text="{Binding Path=Name}" />
        </StackPanel>
    public partial class CreateExam : Page {
        public CreateExam() {
            InitializeComponent();
            CreateExamStackPanel.DataContext = Exam;
        }

        private void CreateButton_Click(object sender, RoutedEventArgs e) {
            if (Exam.Name?.Length > 0)
                MessageBox.Show($"Exam named: {Exam.Name}");
            else
                MessageBox.Show($"Please enter a name for the exam.");
        }

        public Exam Exam { get; set; } = new Exam();
    }

但在我看来,“应该”有一种方法可以完全通过 XAML 绑定到 Exam{Binding Path=Name} 指向Exam 的属性,但有没有办法直接指向Exam 本身?

我已尝试将 {Binding Exam} 添加到 XAML 中的 StackPanelTextBox(并从 C# 中删除 .DataContext = Exam,但这似乎不起作用。

【问题讨论】:

  • 您能否澄清一下,我实际上不确定您要完成什么。
  • 是的,您可以,Text="{Binding}" 将绑定到它自己的考试。但是这里缺少的是 INotifyPropertyChanged 接口实现:docs.microsoft.com/en-us/dotnet/api/…

标签: c# wpf data-binding


【解决方案1】:

我认为您需要 CreateExam 中的整个属性到 Page 对吗?

如果是这样,你可以这样做

public CreateExam()
 {
    InitializeComponent();
     this.DataContext = this;
 }

在您的 XAML 中,您可以像这样绑定

     <StackPanel VerticalAlignment="Center" x:Name="CreateExamStackPanel">
        <TextBox Style="{StaticResource placeHolder}" Tag="Exam Name" 
                 x:Name="NameTextBox" Text="{Binding Path=Exam.Name}" />
    </StackPanel>

或者,如果您需要将整个考试作为页面中的 DataContext,则

public CreateExam()
 {
    InitializeComponent();
     this.DataContext = Exam;
 }

那么你的 XAML 看起来像

 <StackPanel VerticalAlignment="Center" x:Name="CreateExamStackPanel">
    <TextBox Style="{StaticResource placeHolder}" Tag="Exam Name" 
             x:Name="NameTextBox" Text="{Binding Path=Name}" />
</StackPanel>

让我知道您需要哪一个,以便我删除另一个。

【讨论】:

  • 谢谢。我非常喜欢第一个,但我建议你保留两个,因为它们都是不错的选择。
  • 好的,我会保留两个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多