2017-08-20 18 views
-1

DataGridからDataGridにいくつかのプロパティをバインドしようとしています... DataGridComboBoxは空で非表示で、次のソースコードの代わりに2つの行があります。WPF DataGridをバインドする

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"); } } 
} 

私はWPFで新しいですし、私の検索はどこに私をリードしてきました...

はあなたにたくさんありがとうございました!

答えて

1

(これまでのところ)3つの問題があります。

最も簡単な問題は、1つではなく2つの行です。余分な行は新しい項目行です。これを無効にしてください...

<DataGrid Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ClassRow}" AutoGenerateColumns="False" Margin="40" CanUserAddRows="False"> 

次の問題は空のテキストフィールドです。フィールドではなくプロパティにのみバインドできます。したがって、これを修正するには、行オブジェクトのフィールドをプロパティに変更します。

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

最後に、コンボボックスが空である理由は、アイテムソースがデータコンテキストにバインドされていないためです。データグリッドの列はビジュアルツリーの外にあります。だからソースを見つけることができません。このように修正してください。

<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}"/> 
+0

ありがとうございます。 getメソッドとsetメソッドが特別なもの(Pythonに慣れていて、C#で新しくなったこと)になれない場合、PropertiesとPublic attributsが同じではないことはわかりませんでした。ありがとうございました ! – Gaulois94

関連する問題