【问题标题】:WPF datagrid with ToggleButton binding带有 ToggleButton 绑定的 WPF 数据网格
【发布时间】:2011-11-21 17:07:25
【问题描述】:

我对 WPF 比较陌生,并且很难将自定义类绑定到数据网格。虽然文本属性正常(无论如何它们都是只读的),但布尔属性的切换按钮不会在我的项目列表中更新,并且它们也不会根据最初设置的值显示。但是,它们确实可以正确响应 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;
}

【问题讨论】:

    标签: wpf binding datagrid togglebutton


    【解决方案1】:

    您当前绑定到UserControl.ReviewItem,这不是UserControl 上的有效属性。

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

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

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

    【讨论】:

    • 嗨,瑞秋!首先,非常感谢您的回复。请原谅我迟到的回复,因为这是我在这里的第一篇文章,我想当有人回复时我会收到一封电子邮件通知。至于您的建议,我想我必须更改的行是以下,对吗? &lt;ToggleButton Style="{StaticResource ToggleImageStyleBien}" Click="ToggleButton_Click" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=ReviewItem.Good, Mode=TwoWay}" /&gt; 这里正确的解决方案是什么?再次感谢 Joerg。
    • 当我将绑定更改为&lt;ToggleButton Style="{StaticResource ToggleImageStyleBien}" Click="ToggleButton_Click" IsChecked="{Binding Good}" /&gt; 时,Snoop 中没有出现绑定错误。然而 ReviewItems 集合仍然没有更新 true 或 false 值......我正在使用它来检查值:foreach (ReviewItem it in ReviewItems) { textBoxComments.Text += it.Description + ": " + it.Good.ToString() + "\r\n"; }
    • @user1058209 您需要将绑定从ReviewItem.Good 更改为DataContext.ReviewItem.Good,因为UserControl 没有名为ReviewItem 的属性,但UserControl.DataContext 有。 &lt;ToggleButton ... IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.ReviewItem.Good, Mode=TwoWay}" /&gt;
    • 好的,如果我使用以下内容,数据 -> UI 绑定似乎可以工作,因为我可以在代码中的任何 ReviewItem 上设置该属性,并在 UI 中看到该属性。 &lt;ToggleButton ... IsChecked="{Binding Path=Good, Mode=TwoWay}" /&gt; 但是,单击 ToggleButton 确实会更改其视觉效果,但不会更新我的 ReviewItems 列表...
    • 终于想通了!除了以上所有内容之外,我还必须将 UpdateSourceTrigger=PropertyChanged 添加到 ToggleButton。现在我的 ToggleButton 可以正确更新数据源。非常感谢您的指点,瑞秋!
    猜你喜欢
    • 2013-08-11
    • 2011-09-28
    • 2010-11-15
    • 2013-03-09
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多