【问题标题】:Copying text from one field to another if check box is checked如果选中复选框,则将文本从一个字段复制到另一个字段
【发布时间】:2014-09-19 22:17:26
【问题描述】:

如果选中了复选框,我正在尝试将文本从一个文本框发送到另一个文本框。这些字段是在两个不同的 XAML 文件中创建的。

第一个 XAML 文件 (InvolvedPersonStackPanel) 包含复选框和文本框:

如果选中此复选框,则应将相关人员文本框中的文本复制到在不同 XAML 文件中创建的另一个文本框中,如下所示:

在 InvolvedPersonStackPanel.xaml.cs 文件中,我编写了以下代码:

void LivesWithCheckBox_Checked(object sender, RoutedEventArgs e)
{
    per.LivesWithTextBox.Text = personTextBox.Text;
}

这对我不起作用,但我不确定这个问题。也许我应该在另一个 xaml.cs 文件中试试这个。。

【问题讨论】:

  • 如果有人在选中复选框后更改了相关人员会发生什么。他们应该同步吗?是否可以在不更改 InvolvedPerson 的情况下更改 LivesWithTextBox 文本?
  • 是的,只要选中该复选框,它们就应该是同步的。

标签: c# wpf xaml visual-studio-2012


【解决方案1】:

我建议你使用 ViewModel 来绑定两个像这样的视图。阅读MVVM 模式以获取更多信息。

基本上,您的每个 XAML 文件都是 View。然后,您应该确保它们与它们的 DataContext 共享相同的 ViewModel 实例。如果这样做了,您可以使用下面的ViewModel

我强烈建议任何想要使用 WPF 的人尽早学习 MVVM。

public class MyViewModel : INotifyPropertyChanged
{
    private string _involvedPerson;
    private string _livesWithPerson;
    private bool _livesWith;

    public string InvolvedPerson
    {
        get { return _involvedPerson; }
        set
        {
            _involvedPerson = value;
            OnPropertyChanged("InvolvedPerson");
        }
    }

    public string LivesWithPerson
    {
        get
        {
            if (LivesWith)
            {
                return InvolvedPerson;
            }
            return _livesWithPerson;
        }
        set
        {
            if (LivesWith)
            {
                InvolvedPerson = value;
            }
            else
            {
                _livesWithPerson = value;
            }
            OnPropertyChanged("LivesWithPerson");
        }
    }
    public bool LivesWith
    {
        get { return _livesWith; }
        set
        {
            _livesWith = value;
            if (_livesWith)
            {
                LivesWithPerson = null;
            }
            OnPropertyChanged("LivesWith");
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

请注意,您的选中事件也可以更改 LivesWith TextBox 上的绑定以指向 InvolvedPerson 属性。但就个人而言,我更喜欢在 ViewModel 中使用这样的逻辑,这样可以很容易地通过单元测试进行测试。

【讨论】:

  • 帮帮我。这看起来正是 OP 发布给我的内容。
  • 为了避免混淆其他人。我现在还根据 OP 对我的问题的回答编辑了我的答案。
【解决方案2】:

这是我的回答先生,您的逻辑是正确的,但您需要这个:

C#WPF

设计:

2 文本框 1 个复选框

//你之前的回答

    private void YourCheckBox_Checked(object sender, RoutedEventArgs e)
    {
        txtOutput.Text = txtInput.Text;
    }

// ----------你错过了这个!!!!你需要添加这个

    private void txtInput.Text_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (YourCheckBox.IsChecked == true) { txtOutput.Text = txtInput.Text; }
    }

// 最终会是这样的:

    private void YourCheckBox_Checked(object sender, RoutedEventArgs e)
    {
        txtOutput.Text = txtInput.Text;
    }

    private void txtInput.Text_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (YourCheckBox.IsChecked == true) { txtOutput.Text = txtInput.Text; }
    }

// 我希望它有效:D

【讨论】:

  • 这确实适用于同一个表单的两个字段,但在将输入从一个表单传输到另一个表单时不起作用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多