2011-11-21 24 views
1

私はWPFには比較的新しく、カスタムクラスをデータグリッドにバインドするのに苦労しています。テキストプロパティはOKですが(いずれにしても読み取り専用です)、ブール値プロパティのトグルボタンはアイテムリストで更新されず、最初に設定された値に従って表示されません。ただし、UIのクリックに対しては正しく応答します。ToggleButtonバインディングを使用したWPFデータグリッド

<Style x:Key="ToggleImageStyleBien" TargetType="ToggleButton"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <StackPanel> 
        <Image Name="img" Source="Images/transp.png"/> 
       </StackPanel> 
       <ControlTemplate.Triggers> 
        <Trigger Property="ToggleButton.IsChecked" Value="True"> 
         <Setter TargetName="img" Property="Source" Value="Images/good.png"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

ここでは、データグリッドそのものです:

<DataGrid AutoGenerateColumns="False" Height="Auto" Name="dataGridRevision" Width="Auto" Margin="6,6,6,0" ItemsSource="{Binding}" VerticalScrollBarVisibility="Auto" VerticalGridLinesBrush="{x:Null}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Code" Binding="{Binding Code}" Visibility="Collapsed"/> 
     <DataGridTextColumn Header="Descripción" Binding="{Binding Description}" IsReadOnly="True"/> 
     <DataGridTemplateColumn Header="Bien"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ToggleButton Style="{StaticResource ToggleImageStyleBien}" Click="ToggleButton_Click" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=ReviewItem.Good, Mode=TwoWay}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Comentario" /> 
    </DataGrid.Columns> 
</DataGrid> 

これは私がに結合していたクラスです。私の知る限り、私は右を使用していないよ、言うことができるように

public class ReviewItem 
{ 
    public string Code { set; get; } 
    public string Description { set; get; } 
    public bool Good { set; get; } 
    public bool Bad { set; get; } 
    public string Comment { set; get; } 
} 

ToggleButtonのBindingプロパティですが、私はたくさん試してみてアイデアが足りなくなっています。リストプロパティはクリックで変更されません。値はデータに応じて表示されません。

...

感謝を助けてください!

Joerg。

が見つかりました。他の例をもとに、これにクラスを変更:

public class ReviewItem : INotifyPropertyChanged 
{ 
    public string Code { set; get; } 
    public string Description { set; get; } 
    public bool Bad { set; get; } 
    public string Comment { set; get; } 

    private bool _isChecked; 
    public bool Good 
    { 
     get { return _isChecked; } 
     set 
     { 
      System.Diagnostics.Debug.WriteLine("Good = " + value); 
      _isChecked = value; 
      OnPropertyChanged("Good"); 
     } 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

答えて

0

あなたが現在UserControl上で有効なプロパティではありませんこれは、UserControl.ReviewItemに結合されています。

あなたはUserControl.DataContext.ReviewItem.Goodにバインドすることを意味し、代わりにDataGrid.ReviewItems[x].Goodにバインドしたくない場合は、あなただけIsChecked="{Binding Good}"をバインドする必要がUserControl.DataContext.ReviewItem

にバインドする代わりにDataContext.ReviewItemへの結合を試してみてください。 DataGridCell上のデフォルトDataContext行のデータ項目であるので、あなたのコレクションがReviewItemsのリストが含まれている場合、セルのDataContextのは、すでにまたReviewItem

に設定されているので、これは、私は非常にデバッグのためにSnoopを使用することをお勧めしますWPFバインディングアプリケーション上でそれを使用して、個々のUI要素の内容を確認し、バインディングが正しいかどうかを調べることができます。DataContext

+0

こんにちはレイチェル!まず、お返事いただきありがとうございます。そして、私の遅い返事を言い訳してください。これは私の最初の投稿だったので、誰かが応答したら電子メール通知を受け取ると思っていました。 あなたの提案については、私が変更しなければならないラインは、次のようなものでしょうか? {Type:UserControl}}、Path = ReviewItem.Good、Mode = TwoWay} " ' 正しい解決策は何でしょうか? ありがとう、 Joerg。 – Joerg

+0

バインドを ' 'スヌープでバインディングエラーが発生しません。それでも、ReviewItemsコレクションはtrueまたはfalseの値を更新していません。これを使用して値を確認しています: 'foreach(ReviewItem in ReviewItems){textBoxComments.Text + = it.Description +": "+ it.Good.ToString()+ "\ r \ n"; } ' – Joerg

+0

@ user1058209あなたのバインディングを' ReviewItem.Good'から 'DataContext.ReviewItem 'に変更する必要があります。'UserControl'には' ReviewItem'という名前のプロパティはありませんが、 'UserControl.DataContext'はそうです。 '' – Rachel

関連する問題