带有ToggleButton绑定的WPF数据网格

时间:2011-11-21 17:07:25

标签: wpf binding datagrid togglebutton

我对WPF比较陌生,并且很难将自定义类绑定到数据网格。虽然文本属性是正确的(它们仍然是只读的),但布尔属性的togglebuttons不会在我的项目列表中更新,并且它们也不会根据最初设置的值显示。但是,它们会对UI中的点击做出正确回应。

<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本身:

<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属性,但我已经尝试了很多并且已经没有想法了。单击时列表属性不会更改,不会根据数据显示值。

请帮忙......

谢谢!

约尔格。

根据找到的其他示例将类更改为:

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

1 个答案:

答案 0 :(得分:0)

您目前绑定的UserControl.ReviewItem UserControl不是DataContext.ReviewItem上的有效属性。

尝试绑定到UserControl.DataContext.ReviewItem而不是绑定到UserControl.DataContext.ReviewItem.Good

如果您不想绑定到DataGrid.ReviewItems[x].Good,而是想绑定到IsChecked="{Binding Good}",那么您只需要绑定DataContext。这是因为DataGridCell上的默认ReviewItems是行的数据项,因此如果您的集合包含ReviewItem列表,则单元格的DataContext已设置为{{1 }}

另外,我强烈建议使用Snoop来调试WPF绑定。您可以在应用程序中使用它来查看DataContext对于各个UI元素的含义,并确定绑定是否正确。