c# - 如果Binding为NULL,则Datagrid中的WPF ComboBox会引发错误

标签 c# wpf mvvm data-binding datagrid

我有一个要编辑的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/

相关文章:

silverlight - 保持模型和ViewModel同步的最佳实践

c# - 将 Action 注入(inject) UserControl

c# - HTTP 错误 502.5 - 升级到 ASP.NET Core 2.2 后 ANCM 进程外启动失败

wpf - 展开所有 WPF TreeView 项

c# - 从另一个表单刷新 dataGridView 的数据源

c# - 您如何正确测试 MVVM 中的 View ?

wpf - 找不到名为 'ViewModelLocator'的资源

c# - 我无法使用 INotifyPropertyChanged 更新我的值

c# - 每次运行应用程序时生成相同数字的随机数生成器

c# - 如何复制具有深层路径的只读文件并保留文件时间元数据?