Telerik RadComboBox WPF 如何显示数据库表中的值列表



我正在使用带有WPF的MVVM,并且在我的视图中有一个RadComboBox,需要从数据库中的County表中填充。 我的视图模型如下:

 public class AddClientViewModel : BindableBase
 {
    private Client _client;
    private Circuit _circuit;
    private County _county;
    private State _state;
    private SubscriberSpecialty _subscriberSpecialty;
    private IClientsRepository _repository = new ClientRepository();
    private ICircuitRepository _circuitRepository = new CircuitRepository();
    private ICountyRepository _countyRepository = new CountyRepository();
    private IStateRepository _stateRepository = new StateRepository();
    private ISubscriberSpecialty _subscriberSpecialtyRepository = new SubscriberSpecialtyRepository();
    public AddClientViewModel()
    {
        SaveCommand = new RelayCommand(OnSave);
    }
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    public Client Client
    {
        get { return _client; }
        set
        {
            if (value != _client)
            {
                _client = value;
                PropertyChanged(this, new  PropertyChangedEventArgs("Client"));
            }
        }
    }
    public Circuit Circuit
    {
        get { return _circuit; }
        set
        {
            if(value != _circuit)
            {
                _circuit = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Circuit"));
            }
        }
    }
    public County County
    {
        get { return _county;}
        set
        {
            if (value != _county)
            {
                _county = value;
                PropertyChanged(this, new PropertyChangedEventArgs("County"));
            }
        }
    }
    public State State
    {
        get { return _state; }
        set
        {
            if (value != _state)
            {
                _state = value;
                PropertyChanged(this, new PropertyChangedEventArgs("State"));
            }
        }
    }
    public SubscriberSpecialty SubscriberSpecialty
    {
        get { return _subscriberSpecialty; }
        set
        {
            if (value != _subscriberSpecialty)
            {
                _subscriberSpecialty = value;
                PropertyChanged(this, new PropertyChangedEventArgs("SubscriberSpecialty"));
            }
        }
    }
    public Guid ClientId { get; set; }
    public Guid CircuitId { get; set; }
    public Guid CountyId { get; set; }
    public Guid StateId { get; set; }
    public Guid SubscriberSpecialtyId { get; set; }
    public ICommand SaveCommand { get; set; }
    public event Action<Client> AddClient = delegate { };
    public async void LoadClient()
    {
        Client = await _repository.GetClientAsync(ClientId);
    }
    public async void LoadCircuit()
    {
        Circuit = await _circuitRepository.GetCircuitAsync(CircuitId);
    }
    public async void LoadCounty()
    {
        County = await _countyRepository.GetCountyAsync(CountyId);
    }
    public async void LoadState()
    {
        State = await _stateRepository.GetStateAsync(StateId);
    }
    public async void LoadSubscriberSpecialty()
    {
        SubscriberSpecialty = await _subscriberSpecialtyRepository.GetSubscriberSpecialtyAsync(SubscriberSpecialtyId);
    }
    private void OnAddClient()
    {
        AddClient(new Client {ClientId = Guid.NewGuid()});
    }
    private async void OnSave()
    {
        try
        {
            Client = await _repository.AddClientAsync(new Client());
        }
        catch (Exception ex)
        {
            MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception", MessageBoxButton.OK,
                MessageBoxImage.Warning);
        }
    }
}

该界面具有以下内容:

Task<County> GetCountyAsync(Guid countyId);

存储库类调用接口的方式如下:

public Task<List<County>> GetCountiesAsync()
{
    return _context.Counties.ToListAsync();
}

然后,我的视图使用以下语法:

<telerik:RadComboBox x:Name="Countycombo" 
 Grid.Column="1" Grid.Row="3" 
 ItemsSource="{Binding County.CountyName}" 
 DisplayMemberPath="CountyName" Width="120"/>

我在布局中定义了一个数据上下文,如下所示:

 <UserControl.DataContext>
    <viewModels:AddClientViewModel />
</UserControl.DataContext>

当我运行应用程序时,RadComboBox 不会从 County 表中获取值,我已经将 CountyName 的多个值加载到该表中。 如何更正上述代码片段以确保填充我的县名?

更新:当我从 County.CountyName 中删除 County 时,我收到一条消息,指出Cannot resolve property CountyName in DataContext MySolution.ViewModels.MyViewModel LoadCounty 或其他部分中的视图模型中需要哪些额外的工作?

我会提出以下建议:

引入 ViewModel 属性,该属性将保存County对象列表:

private List<County> _counties;
public List<County> Counties
{
    get { return _counties;}
    set
    {
        if (value != _counties)
        {
            _counties = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Counties"));
        }
    }
}

将组合框ItemsSource绑定到县属性,将组合框SelectedItem属性绑定到县属性。

<telerik:RadComboBox x:Name="Countycombo" 
 Grid.Column="1" Grid.Row="3" 
 ItemsSource="{Binding Counties}" 
 SelectedItem="{Binding County}"
 DisplayMemberPath="CountyName" Width="120"/>

并且您需要一个地方,您将通过对GetCountiesAsync的存储库调用加载县.结果应设置为"视图模型县"属性。

  public async void LoadCounties()
  {
     Counties = await _countyRepository.GetCountiesAsync();
  }

不确定拨打该电话的最佳位置是什么。

最新更新