我有一个datagriId绑定到一个可观察的集合。我想将正确的值存储在observable集合中(包含所有小数),但我希望在datagrid中看到更少的小数。 所以我尝试了这个 Change DataGrid cell value programmatically in WPF 还有一些类似的人。
最后我需要的是在事件被触发时更改datagrid的值。
private void Datagrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
DataGridRow row = e.Row;
var pePCDmise = row.Item as PcDmisData.Measures;
DataGridRow rowContainer = dtgResults.GetRow(0);
DataGridCell d = dtgResults.GetCell(rowContainer, 3);
}
所以上面的rowcontainer不是null但是当我尝试获取单元格值时,我得到一个null异常。 特别:
public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
{
if (row != null)
{
DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);
if(presenter == null)
{
grid.ScrollIntoView(row, grid.Columns[column]);
presenter = GetVisualChild<DataGridCellsPresenter>(row);
}
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
return cell;
}
return null;
}
上面的演示者为空,在输入if。
后也为空我怎样才能让它发挥作用? 感谢名单
--- ---- ADD 除了上述问题,我怎样才能进行单向绑定?我已经用
设置了datagrid绑定 dtgResults.ItemsSource = easyRunData.olstMeasures;
但现在我只想更改dtgResults的小数位数而不是可观察的集合值。
答案 0 :(得分:1)
更改DataGridCell值的最简单方法是使用Loaded event handler
的{{1}}:
TextBlock
如果<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Area, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Loaded="TextBlock_Loaded"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{
TextBlock tb = ((TextBlock)sender);
// do anything with textblock
if (tb.Text == 10)
{
tb.Background = Brushes.Plum;
}
}
,那么我们需要处理DataGridCell的Loaded事件。
AutogenerateColumns = true
答案 1 :(得分:0)
如果您在后面的代码中为DataGrid
生成列,则可以编写类似这样的内容。 Xaml部分。
<DataGrid Name="dgTest" AutoGenerateColumns="False">
</DataGrid>
ValueConverter
代码。在考试中,我使用了3位数的舍入,但您可以将其作为ConverterParameter
传递并改进代码。
public sealed class DecimalConverter : IValueConverter
{
public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
double result = 0;
if ( value is double )
result = Math.Round( ( double )value, 2 );
return result;
}
public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
throw new NotImplementedException();
}
}
初始化代码。
DataGridTextColumn valColumn = new DataGridTextColumn();
Binding valBinding = new Binding( "SomeVal" );
valBinding.Converter = new DecimalConverter();
valColumn.Binding = valBinding;
dgTest.Columns.Add( valColumn );
dgTest.ItemsSource = Objects;
我的测试Observable集合名为Objects
,包含具有双重属性SomeVal
和实现INotifyPropertyChanged
行为的对象。
private double _someVal;
public double SomeVal
{
get { return _someVal; }
set { _someVal = value; NotifyPropertyChanged( "SomeVal" ); }
}
更新典型的INotifyPropertyChanged
实现。
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void NotifyPropertyChanged( String info )
{
if ( PropertyChanged != null )
{
PropertyChanged( this, new PropertyChangedEventArgs( info ) );
}
}