C# WPF绑定数据网格

C# WPF绑定数据网格,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我试图将一些属性从DataContext绑定到DataGrid,但没有成功。。。 DataGridComboBox在单击它之前是空的和不可见的,对于下面的源代码,我有两行而不是一行 XAML <DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False"> <DataGrid.Columns>

我试图将一些属性从DataContext绑定到DataGrid,但没有成功。。。 DataGridComboBox在单击它之前是空的和不可见的,对于下面的源代码,我有两行而不是一行

XAML

<DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridComboBoxColumn Header="Classe" x:Name="Class_ClassName" Width="100" SelectedItemBinding="{Binding ClassName, Mode=TwoWay}" ItemsSource="{Binding ClassList}"/>
    <DataGridTemplateColumn Header="Niveau">
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBox x:Name="LevelTxt"  Width="50" TextChanged="LevelTxtTextChanged" Text="{Binding ClassLevel, TargetNullValue={x:Static sys:String.Empty}}"/>
            <StackPanel Orientation="Vertical">
              <Button x:Name="LevelUp"   Content="+" Width="15" Height="15" Click="LevelUpClick" FontSize="10" VerticalContentAlignment="Top" />
              <Button x:Name="LevelDown" Content="-" Width="15" Height="15" Click="LevelDownClick" FontSize="12" VerticalContentAlignment="Bottom"/>
            </StackPanel>
          </StackPanel>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

DataContext:

public class ClassRow
{
    public String ClassName;
    public int    ClassLevel;  
}

public class PJDataWindow : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected List<ClassRow>  m_classRow;
    protected List<String>    m_classList;

    public PJDataWindow()
    {
        m_classRow   = new List<ClassRow>();
        m_classList  = new List<String>();

        //Test
        m_classList.Add("Classe1");
        m_classRow.Add(new ClassRow { ClassName = "Classe1", ClassLevel = 2 });

        OnPropertyChanged("ClassList");
        OnPropertyChanged("ClassRow");
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    public List<ClassRow>  ClassRow
    {
        get
        {
            return m_classRow;
        }

        set
        {
            m_classRow = value;
            OnPropertyChanged("ClassRow");
        }
    }

    public List<String> ClassList { get => m_classList; set { m_classList = value; OnPropertyChanged("ClassList"); } }
}
公共类类行
{
公共字符串类名;
公共int类级别;
}
公共类PJDataWindow:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
受保护列表m_classRow;
受保护列表m_类列表;
公共PJDataWindow()
{
m_classRow=新列表();
m_classList=新列表();
//试验
m_classList.Add(“Classe1”);
添加(新的classRow{ClassName=“Classe1”,ClassLevel=2});
OnPropertyChanged(“类别列表”);
OnPropertyChanged(“ClassRow”);
}
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称));
}
公共列表类行
{
得到
{
返回m_classRow;
}
设置
{
m_classRow=值;
OnPropertyChanged(“ClassRow”);
}
}
公共列表ClassList{get=>m_ClassList;set{m_ClassList=value;OnPropertyChanged(“ClassList”);}
}
我是WPF的新手,我的搜索结果让我一无所获

多谢各位

目前有3个问题

最简单的问题是两行而不是一行。额外的行是新项目行。像这样关掉这个

  <DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False" Margin="40" CanUserAddRows="False">
最后,组合框为空的原因是项源未绑定到数据上下文。数据网格列位于可视化树的外部。所以它找不到源头。像这样修理它

    <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
    <DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False" Margin="40" CanUserAddRows="False" x:Name="dataGrid">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Classe" x:Name="Class_ClassName" Width="100" SelectedItemBinding="{Binding ClassName, Mode=TwoWay}" ItemsSource="{Binding Source={x:Reference dummyElement}, Path=DataContext.ClassList}"/>

谢谢,它是这样工作的。我不知道,如果get和set方法没有什么特殊的功能(习惯于Python,我是C#新手),那么属性和公共属性就不一样了。非常感谢。
    <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
    <DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False" Margin="40" CanUserAddRows="False" x:Name="dataGrid">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Classe" x:Name="Class_ClassName" Width="100" SelectedItemBinding="{Binding ClassName, Mode=TwoWay}" ItemsSource="{Binding Source={x:Reference dummyElement}, Path=DataContext.ClassList}"/>