我有一个要编辑的DataGrid。一列是组合框
<DataGrid ItemsSource="{Binding Persons, Mode=TwoWay}"
SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Company" >
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Companies}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Company.Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
问题是如果公司是
null
,那么我会收到错误Two-way binding requires Path or XPath
我如何解决这个问题,以允许将Company设置为null?
最佳答案
Text="{Binding Company.Name}"
始终要求Company
为有效对象,因为系统最终希望访问Name
属性。我仍然希望您可以创建一个虚拟Company对象并将Name设置为空字符串。否则,转换器将帮助:
<DataGrid ItemsSource="{Binding Persons, Mode=TwoWay}"
SelectedItem="{Binding SelectedPerson, Mode=TwoWay}" >
<DataGrid.Resources>
<local:MyConverter x:Key="MyConverter"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Company" >
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Companies}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Company, Converter={StaticResource MyConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
public class MyConverter : IValueConverter
{
public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return string.Empty;
}
Type myType = value.GetType ();
PropertyInfo pinfo = myType.GetProperty ("Name");
if (pinfo == null)
{
return string.Empty;
}
return (string)pinfo.GetValue(value);
}
public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
转换器使用反射来访问
Name
属性。如果转换器可以访问Company
类型(并且逻辑允许),则可以直接使用。
关于c# - 如果Binding为NULL,则Datagrid中的WPF ComboBox会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919990/