繁体   English   中英

如何在 C# 项目中使用 DataGridComboBoxColumn?

[英]How to use DataGridComboBoxColumn in C# project?

我的 C# WPF 项目遇到了一些问题,尤其是 DataGridComboBoxColumn 控件。 所以,这是我的MainWindow.xaml文件的一部分:

<DataGrid x:Name="WorkDayGrid"
          AutoGenerateColumns="False"
          CanUserAddRows="False"
          CanUserDeleteRows="False"
          CanUserSortColumns="False"
          ItemsSource="{Binding}">
    <DataGrid.Resources>
        <local:Times x:Key="times" />
        <local:TimeConverter x:Key="timeConverter" />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Arrival Time"
                                ItemsSource="{StaticResource times}"
                                SelectedItemBinding="{Binding ArrivalTime, Converter={StaticResource timeConverter}}" />
    </DataGrid.Columns>
</DataGrid>

以及相应的“代码隐藏”:

public partial class MainWindow : Window
{
    private ObservableCollection<WorkDay> _workDays = new ObservableCollection<WorkDay>();

    public MainWindow()
    {
        InitializeComponent();

        ComputeWorkDays();
        WorkDayGrid.DataContext = _workDays;
    }

    private void ComputeWorkDays()
    {
        _workDays.Clear();

        for (var i = 1; i <= 31; ++i)
        {
            var d = new WorkDay();
            _workDays.Add(d);
        }
    }
}

WorkDay类的代码:

class WorkDay
{
    public Time ArrivalTime { get; set; }
}

Times类的代码:

class Times : ObservableCollection<Time>
{
    public Times()
    {
        var firstHour = 7;
        var lastHour = 20;
        var minuteStep = 5;

        for (var i = firstHour; i < lastHour; ++i)
        {
            for (var j = 0; j < 60; j += minuteStep)
            {
                var t = new Time
                {
                    Hour = i,
                    Minute = j
                };
                Add(t);
            }
        }
    }
}

Time类的代码:

class Time
{
    private int _hour = 0;
    private int _minute = 0;

    public int Hour
    {
        set => _hour = value;
    }
    public int Minute
    {
        set => _minute = value;
    }

    public override string ToString()
    {
        var fmt = "D2";
        return _hour.ToString(fmt) + ":" + _minute.ToString(fmt);
    }
}

TimeConverter类的代码:

class TimeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            var time = (Time)value;
            return time.ToString();
        }
        else
        {
            string result = "";
            return result;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (Time)value;
    }
}

问题是当我在一个单元格中选择一个值时(感谢相关的组合框),相同的值也会显示在另一个单元格中。 此外,当我向下滚动到数据网格中的另一行时,所选值会消失。 我想知道 DataGridComboBoxColumn 是否运行良好...我使用 .NET 框架 4.6.1。 非常感谢您的帮助。

归根结底,是绑定转换器导致了问题。 感谢@Clemens 的帮助。

仅供参考,我不使用 DateTime 结构,因为我需要一个“无效”时间来允许用户取消其选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM