You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF中实现单选按钮选择的位置作为类属性显示在新窗口

问题描述

我是C#新手,正在开发一个基础WPF项目:

  • 用户输入客户信息(姓名、电话、邮箱)
  • 通过菜单项MenuLocClient中的三个单选按钮选择位置
  • 点击'Add Client'后,客户姓名显示在列表框LstClients中
  • 选中列表项点击'Show Client',弹出'Client details'窗口展示完整客户信息(含位置)

已定义的Client类:

namespace WpfApp_project
{
    public partial class Client
    {
        public string Name { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Location { get; }

        public Client(string n, string p, string e, string l)
        {
            Name = n;
            Phone = p;
            Email = e;
            Location = l;
        }
    }
}

ClientDetails窗口代码:

public partial class ClientDetails : Window
{          
    public ClientDetails(Client c)
    {
        InitializeComponent();
        LblNameClient.Content = c.Name;
        lblPhoneClient.Content = c.Phone;
        lblEmailClient.Content = c.Email;
        lblLocClient.Content = c.Location; // 修正原代码拼写错误:blLocClient → lblLocClient
    }
}

MainWindow部分代码:

public partial class MainWindow : Window
{
    List<Client> ClientList = new List<Client>();
    public MainWindow()
    {
        InitializeComponent();
    }

    // 不确定如何实现单选按钮选中位置的获取,以及如何传入Client构造函数
    public void radio_selected(…)
    {
        string selected;
        if (RBLocE.isChecked) { selected = “Edinburgh”};
        else if (RBLocG.isChecked) { selected = “Glasgow”};
        else if (RBLocO.isChecked) { selected = “Other”};

        Client c = … 
        c.Location = selected; // 此处报错,因为Location是只读属性
    }

    private void newClient(object sender, RoutedEventArgs e)
    {
        Client c = new Client(boxClientName.Text, boxClientPhone.Text, boxClientEmail.Text, ...);  // 不知道怎么传入选中的位置
        BoxClientName.Clear(); // 控件名称大小写不统一,建议改成boxClientName
        boxClientPhone.Clear();
        boxClientEmail.Clear();
        // 不知道怎么重置单选按钮状态
        ClientList.Add(c);
        lstClients.ItemsSource = null;
        lstClients.ItemsSource = ClientList;
    }

    private void showDetails(object sender, RoutedEventArgs e)
    {
        Client c = lstClients.SelectedItem as Client;
        if (c != null)
        {
            ClientDetails w = new ClientDetails(c);
            w.Show();
        }
    }
}

不清楚如何在MainWindow中编写方法,将单选按钮选中的位置添加为Client类的属性,请帮忙完善相关方法?


完善方案

不需要单独编写radio_selected方法,直接在newClient按钮点击事件中获取选中位置即可,同时修正代码中的语法与逻辑问题:

1. 修正并完善newClient方法

private void newClient(object sender, RoutedEventArgs e)
{
    // 1. 获取选中的位置(注意WPF控件属性为PascalCase,即IsChecked)
    string selectedLocation = string.Empty;
    if (RBLocE.IsChecked == true)
    {
        selectedLocation = "Edinburgh";
    }
    else if (RBLocG.IsChecked == true)
    {
        selectedLocation = "Glasgow";
    }
    else if (RBLocO.IsChecked == true)
    {
        selectedLocation = "Other";
    }

    // 可选:校验位置是否选中,避免创建无位置的客户
    if (string.IsNullOrEmpty(selectedLocation))
    {
        MessageBox.Show("请选择客户位置!");
        return;
    }

    // 2. 创建Client实例(统一控件名称大小写,比如BoxClientName改为boxClientName)
    Client c = new Client(boxClientName.Text, boxClientPhone.Text, boxClientEmail.Text, selectedLocation);
    
    // 3. 清空输入框
    boxClientName.Clear();
    boxClientPhone.Clear();
    boxClientEmail.Clear();
    
    // 4. 重置单选按钮状态
    RBLocE.IsChecked = false;
    RBLocG.IsChecked = false;
    RBLocO.IsChecked = false;
    
    // 5. 添加到列表并更新UI
    ClientList.Add(c);
    lstClients.ItemsSource = null;
    lstClients.ItemsSource = ClientList;
}

2. 优化建议:用ObservableCollection替代List

如果想简化UI更新逻辑,可将List<Client>替换为ObservableCollection<Client>,它会自动通知UI刷新,无需手动重置ItemsSource:

// 替换原List定义
ObservableCollection<Client> ClientList = new ObservableCollection<Client>();

// 在newClient方法中,移除以下两行:
// lstClients.ItemsSource = null;
// lstClients.ItemsSource = ClientList;
// 仅保留添加操作即可
ClientList.Add(c);

3. 其他需要修正的细节

  • 原代码中的中文引号需改为英文双引号""
  • 控件名称需保持大小写一致(如BoxClientName统一为boxClientName)
  • 单选按钮的属性名isChecked需改为IsChecked(WPF控件属性遵循PascalCase命名规范)

内容的提问来源于stack exchange,提问作者Bluetail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:50:21