C# WPF绑定数据网格
我试图将一些属性从DataContext绑定到DataGrid,但没有成功。。。 DataGridComboBox在单击它之前是空的和不可见的,对于下面的源代码,我有两行而不是一行 XAMLC# 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>
<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}"/>