Я использую xamDataGrid. Я хочу отключить ячейку для столбца STATUS, если значение равно DBNull. Кажется, проблема связана с FieldSettings, я не могу передать правильное значение для этой ячейки в конвертер. Вот код:
XAML:
<Window.Resources>
<dbNullConverter:DBNullToBooleanConverter x:Key="NullToBooleanConverter" />
</Window.Resources>
<Grid>
<DockPanel>
<IgDp:XamDataGrid x:Name="gridData" DataSource="{Binding Path=TempDataTable}">
<IgDp:XamDataGrid.FieldLayoutSettings>
<IgDp:FieldLayoutSettings AutoGenerateFields="True"/>
</IgDp:XamDataGrid.FieldLayoutSettings>
<IgDp:XamDataGrid.FieldSettings>
<IgDp:FieldSettings AllowEdit="True" />
</IgDp:XamDataGrid.FieldSettings>
<IgDp:XamDataGrid.FieldLayouts>
<IgDp:FieldLayout>
<IgDp:Field Name="STATUS" Label="STATUS">
<IgDp:Field.Settings>
<IgDp:FieldSettings AllowEdit="{Binding Source={RelativeSource Self}, Path=Self, Converter={StaticResource NullToBooleanConverter}}" />
</IgDp:Field.Settings>
</IgDp:Field>
<IgDp:Field Name="ROWID" />
<IgDp:Field Name="RESULT" Label="VALUE" />
<IgDp:Field Name="HasRowBeenEdited" Label="Edited ?">
<IgDp:Field.Settings>
<IgDp:FieldSettings EditorType="{x:Type igEditors:XamCheckEditor}"/>
</IgDp:Field.Settings>
</IgDp:Field>
</IgDp:FieldLayout>
</IgDp:XamDataGrid.FieldLayouts>
</IgDp:XamDataGrid>
</DockPanel>
</Grid>
Редактировать :
Ошибка именно в этой строке:
<IgDp:FieldSettings AllowEdit="{Binding Source={RelativeSource Self}, Path=Self, Converter={StaticResource NullToBooleanConverter}}" />
Модель представления:
public class DBNullConverterViewModel : INotifyPropertyChanged
{
private DataTable tempDataTable;
public DataTable TempDataTable
{
get { return tempDataTable; }
set
{
tempDataTable = value;
RaisedPropertyChanged("tempDataTable");
}
}
public DBNullConverterViewModel()
{
TempDataTable = new DataTable();
GetValue();
}
private void GetValue()
{
tempDataTable.Columns.Add(new DataColumn("ROWID", typeof(Int32)));
tempDataTable.Columns.Add(new DataColumn("STATUS", typeof(string)));
tempDataTable.Columns.Add(new DataColumn("StatusNew", typeof(string)));
tempDataTable.Columns.Add(new DataColumn("HasRowBeenEdited", typeof(bool)));
DataRow row = tempDataTable.NewRow();
row["ROWID"] = 1;
row["STATUS"] = "Active";
row["StatusNew"] = "New";
row["HasRowBeenEdited"] = true;
tempDataTable.Rows.Add(row);
tempDataTable.AcceptChanges();
DataRow row1 = tempDataTable.NewRow();
row1["ROWID"] = 2;
row1["STATUS"] = DBNull.Value;
row1["StatusNew"] = null;
row1["HasRowBeenEdited"] = DBNull.Value;
tempDataTable.Rows.Add(row1);
tempDataTable.AcceptChanges();
RaisedPropertyChanged("tempDataTable");
}
}
Конвертер:
public class DBNullToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == DBNull.Value)
return false;
return true;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
IMP: мне нужно чистое решение ViewModel.
{Binding ..., TargetNullValue="Target Null"}
или{Binding ..., FallbackValue="Binding Failed"}
. Подробнее здесь и здесь соответственно. ХТН - person XAMlMAX   schedule 15.04.2014Status
в пользовательском интерфейсе должна быть отключена в строке 2, поскольку она имеет значение DbNull, однакоStatusNew
по-прежнему будет включена, поскольку она равна нулю. - person Maverick   schedule 15.04.2014