我对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;
}
答案 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元素的含义,并确定绑定是否正确。