如何将 ObjectID 转换为 String 以进行文本框绑定?

How to convert ObjectID to String for text box binding?

我在将 ObjectID 从我的模型绑定到文本框文本时遇到绑定错误 属性。

我通过谷歌搜索错误详细信息得知,该错误是由于文本框需要一个字符串值,而 ObjectID 是一个十六进制值。

所以在 ObjectID 属性 中我编辑了 setter 以将 ID 转换为字符串类型。 (但我收到一个转换错误,说明我无法将 ObjectID 隐式转换为字符串):

        set
        {
            id = Convert.ToString(value);
        }

有谁知道如何将 ID 转换为字符串类型,以满足文本框上的文本 属性 绑定?

我得到的window数据错误如下:

System.Windows.Data Error: 1 : Cannot create default converter to perform 'two-way' conversions between types 'MongoDB.Bson.ObjectId' and 'System.String'. Consider using Converter property of Binding. BindingExpression:Path=SelectedItem.Id; DataItem='DataGrid' (Name='customersgrid'); target element is 'TextBox' (Name='iDTbx'); target property is 'Text' (type 'String')

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='5565d8adba02d54a4a78be96' BindingExpression:Path=SelectedItem.Id; DataItem='DataGrid' (Name='customersgrid'); target element is 'TextBox' (Name='iDTbx'); target property is 'Text' (type 'String')

xaml 绑定的示例如下:

<Window x:Class="MongoDBApp.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:email_validator="clr-namespace:MongoDBApp.Validator"
        Title="Orders Dashbord"
        Width="800"
        Height="500">



    <Grid>
        <TabControl>
            <TabItem Header="Customer">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="70" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="1*" />
                        <RowDefinition Height=".50*" />
                        <RowDefinition Height="1*" />
                        <RowDefinition Height="1*" />
                        <RowDefinition Height="1*" />
                        <RowDefinition Height="1*" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width=".1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="2*" />
                        <ColumnDefinition Width=".5*" />
                    </Grid.ColumnDefinitions>

                    <DataGrid Name="customersgrid"
                              Grid.Row="0"
                              Grid.RowSpan="3"
                              Grid.Column="1"
                              Grid.ColumnSpan="3"
                              AutoGenerateColumns="False"
                              ItemsSource="{Binding Customers}"
                              SelectedItem="{Binding SelectedCustomer}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Id}" Header="ID" />

                        </DataGrid.Columns>
                    </DataGrid>


                    //ID textbox
                    <TextBox x:Name="iDTbx"
                             Grid.Row="4"
                             Grid.Column="2"
                             Grid.ColumnSpan="2"
                             Width="120"
                             Height="23"
                             HorizontalAlignment="Right"
                             VerticalAlignment="Top"
                             BorderBrush="AliceBlue"
                             IsReadOnly="True"
                             Text="{Binding SelectedItem.Id,
                                            ElementName=customersgrid}"
                             TextWrapping="Wrap" />

                </Grid>
            </TabItem>

            <TabItem Header="Order" />

            <TabItem Header="OrderStatus" />

        </TabControl>
    </Grid>

</Window>

这是模型中的 ObjectID 属性,减去我的无效转换代码:

    [BsonId]
    public ObjectId Id 
    {
        get
        {
            return id;
        }
        set
        {

            id = value;
        }
    }

TextBox 的 Text 属性 默认绑定双向,这意味着需要与 string 之间的转换。

因为你在你的 TextBox 上设置 IsReadOnly="True" 你似乎只需要一个单向绑定,所以你可以写

<TextBox Text="{Binding SelectedItem.Id, ElementName=customersgrid, Mode=OneWay}" .../>

更好的是,当您不想编辑值时,根本不要使用 TextBox。请改用 TextBlock,其中 Text 属性 默认绑定单向。那么您不需要任何转换器,因为 Binding 会通过调用其 ToString() 方法将值隐式转换为 string

<TextBlock Text="{Binding SelectedItem.Id, ElementName=customersgrid}" .../>