Сетка данных WPF с привязкой ToggleButton - PullRequest
2 голосов
/ 21 ноября 2011

Я относительно новичок в 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:

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

Насколько я могу судить, я не использую правильное свойство Binding в ToggleButton, но я много пробовал и исчерпал идеи. Свойства списка не меняются при нажатии, значения не отображаются в соответствии с данными.

Пожалуйста, помогите ...

Спасибо!

Йорг.

Изменен класс на этот, основываясь на других найденных примерах:

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 голосов
/ 21 ноября 2011

В настоящее время вы привязываетесь к UserControl.ReviewItem, который не является допустимым свойством для UserControl.

Попробуйте вместо этого привязать к DataContext.ReviewItem, что приведет к привязке к UserControl.DataContext.ReviewItem

Если вы не хотите связываться с UserControl.DataContext.ReviewItem.Good, а вместо этого хотите связать с DataGrid.ReviewItems[x].Good, то вам нужно только связать IsChecked="{Binding Good}".Это связано с тем, что по умолчанию DataContext для DataGridCell является элементом данных строки, поэтому, если ваша коллекция содержит список ReviewItems, DataContext ячейки уже имеет значение ReviewItem

Кроме того, я настоятельно рекомендую использовать Snoop для отладки привязок WPF.Вы можете использовать его в своем приложении, чтобы узнать, что означает DataContext для отдельных элементов пользовательского интерфейса, и выяснить, верны ли ваши привязки.

...