C# 在ListView中使用datasource设置组合框的值

C# 在ListView中使用datasource设置组合框的值,c#,wpf,xaml,listview,combobox,C#,Wpf,Xaml,Listview,Combobox,我有一个问题,combobox没有设置为列表视图中的绑定值 从下面的屏幕截图中可以看到,其他值是从绑定中正确填充的。这是否与它是一个组合框而不是一个文本框/标签有关 admin组合有两个选项,true或false。listview(下面的代码)绑定到的datatable包含各种记录的值“True”和“False” <ListView Name="grdUsers" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="6,2

我有一个问题,combobox没有设置为列表视图中的绑定值

从下面的屏幕截图中可以看到,其他值是从绑定中正确填充的。这是否与它是一个组合框而不是一个文本框/标签有关

admin组合有两个选项,true或false。listview(下面的代码)绑定到的datatable包含各种记录的值“True”和“False”

<ListView Name="grdUsers" HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="6,27,0,0" VerticalAlignment="Top" Height="225" Width="289"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListView.View>
            <GridView >
                <GridViewColumn DisplayMemberBinding="{Binding Path=PK}" Header="PK" Width="30">
                </GridViewColumn>
                <GridViewColumn Header="Name" Width="115">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Name}" Width="115"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Group" Width="50">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=MemberGroup}" Width="45"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Admin" Width="70">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Text="{Binding Path=IsAdmin}"  Width="55">
                                <ComboBoxItem>True</ComboBoxItem>
                                <ComboBoxItem>False</ComboBoxItem>
                            </ComboBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

真的
假的
这是这里的最后一个问题,我已经尝试将绑定更改为selectedItem和所有类型

那么,如何将datatable值绑定到组合,为什么它不适用于组合,而适用于文本框


谢谢

如果
IsAdmin
是一个仅包含
True
False
的字符串,您只需使用
StringToBoolean
转换器将其绑定到
复选框

public class StringToBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value.ToString() == "True") ? true : false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
将此转换器用作资源

<Window.Resources>
    <local:StringToBooleanConverter x:Key="strToBoolConverter"/>
</Window.Resources>

并在绑定中使用它

          <GridViewColumn Header="Admin" Width="70">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Path=IsAdmin, Converter={StaticResource strToBoolConverter}}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

这是因为您的
组合框
有两个
ComboBoxItem
类型的项目,而不是
字符串
,这意味着
SelectedItem
也将是
ComboBoxItem
类型。试着这样做:

<ComboBox SelectedItem="{Binding Path=IsAdmin}" Width="55">
   <ComboBox.Items>
      <sys:String>True</sys:String>
      <sys:String>False</sys:String>
   </ComboBox.Items>
</ComboBox>
xmlns:System="clr-namespace:System;assembly=mscorlib"
...
<ComboBox.Items>
    <System:Boolean>True</System:Boolean>
    <System:Boolean>False</System:Boolean>
</ComboBox.Items>

有许多方法可以解决您的问题。就个人而言,我更喜欢使用实际的
bool
属性来表示布尔值。使用此方法,您需要将
Bind
绑定到包含
true
false
值的
bool
集合,然后将
IsAdmin
属性(如果类型为
bool
)绑定到
组合框的
SelectedItem
属性

<ComboBox ItemsSource="{Binding BoolCollection}" SelectedItem="{Binding IsAdmin}" />

@dkozl提到了另一种方法,尽管我认为您仍然需要将
IsAdmin
属性绑定到
组合框的
SelectedItem
属性,而不是
文本
值。

IsAdmin
是布尔属性吗?如果您的选项为真或假,为什么不使用复选框呢?它将作为字符串“真”或“假”显示。我试过了,但也没用。谢谢,但是在加载表单时仍然没有显示默认值。下拉项显示得很好,但相对值不好。@Jacooobley,我已经更新了答案。尝试使用
SelectedItem
而不是
Text
,并注意这将区分大小写。这很好!非常感谢:-)所以这与我使用的comboItem类型有关。非常感谢我对XAML比较陌生,所以顶级代码片段在解决方案中需要自己的类吗?
StringToBooleanConverter
是它自己的类。根据名称空间的不同,您必须包含相关的using语句。例如,我在命名空间
WpfApplication4
下创建了它,因此我将语句
xmlns:local=“clr namespace:WpfApplication4”
添加到我的xaml中,并将其用作

xmlns:System="clr-namespace:System;assembly=mscorlib"
...
<ComboBox.Items>
    <System:Boolean>True</System:Boolean>
    <System:Boolean>False</System:Boolean>
</ComboBox.Items>