【问题标题】:C#, WPF DataGrid displays empty rowsC#,WPF DataGrid 显示空行
【发布时间】:2020-12-15 02:38:02
【问题描述】:

我正在尝试为我的应用程序制作 WPF UI,但被困在将 BindingList 绑定到 DataGrid 上。 它根据列表中的项目数量显示行,但单元格是空的

将集合类型更改为 List 或 ObservableCollection 没有产生任何结果

MainWindow.xaml - DataGrid 代码

        <DataGrid x:Name="DataGrid1" Grid.Column="1" CanUserResizeRows="False" CanUserResizeColumns="False" ColumnWidth="*" AutoGenerateColumns="False">
            <DataGrid.Resources>
                <DataTemplate x:Key="ButtonCellTemplate">
                    <DataGridCell>
                        <Button x:Name="EditButton" Click="EditButton_Click">Edit</Button>
                    </DataGridCell>
                </DataTemplate>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Command" Binding="{Binding Command}"/>
                <DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
                <DataGridTemplateColumn Width="Auto" CellTemplate="{StaticResource ButtonCellTemplate}"/>
            </DataGrid.Columns>
        </DataGrid>

MainWindow.xaml.cs

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            VoiceApp.LoadData("Elite.xml");
            DataGrid1.ItemsSource = VoiceApp.commands;
        }
    }

VoiceApp.commandspublic static BindingList&lt;VoiceCommand&gt; commands { get; set; }

VoiceCommand.cs

public class VoiceCommand
    {
        public string Command { get; set; }
        public string Description { get; set; }
        public BindingList<KeyAction> actions = new BindingList<KeyAction>();
}

VoiceApp.cs

    public static class VoiceApp
    {
        static readonly CultureInfo eng = new CultureInfo("en-US");
        public static SpeechRecognitionEngine recognitionEngine = new SpeechRecognitionEngine(eng);

        public static BindingList<VoiceCommand> commands { get; set; } = new BindingList<VoiceCommand>();
        public static void ActivateRecognition()
        {
            Choices choices = new Choices(commands.Select(x => x.Command).ToArray());
            GrammarBuilder grammarBuilder = new GrammarBuilder(choices);
            grammarBuilder.Culture = eng;
            Grammar grammar = new Grammar(grammarBuilder);
            recognitionEngine.LoadGrammar(grammar);
            recognitionEngine.SetInputToDefaultAudioDevice();
            recognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
        }
        public static void DeactivateRecognition()
        {
            recognitionEngine.RecognizeAsyncStop();
        }
        public static void SaveData(string path = "testSave.xml")
        {
            var ser = new XmlSerializer(typeof(List<VoiceCommand>));
            var saveData = commands.ToList();
            var writer = new FileStream(Path.ChangeExtension(path, "xml"), FileMode.Create);
            ser.Serialize(writer, saveData);
        }
        public static void LoadData(string path = "testSave.xml")
        {
            var ser = new XmlSerializer(typeof(List<VoiceCommand>));
            var reader = new FileStream(path, FileMode.Open);
            commands = new BindingList<VoiceCommand>(ser.Deserialize(reader) as List<VoiceCommand>);
        }
    }

【问题讨论】:

  • "单元格为空" - 但您已为项目的 Command 和 Description 属性赋值?
  • 您能否展示一个完整的代码,让我们可以看到VoiceApp 是什么以及如何分配commands 等?
  • 是否有任何日志输出表明您的绑定失败?
  • VoiceApp.commands 在 UI 的 WinForms 变体中运行良好

标签: c# wpf datagrid


【解决方案1】:

问题在于保存的文件本身,因为属性以不同的名称保存。修复它们解决了这个问题。

【讨论】: