C# 在ListView中使用datasource设置组合框的值
我有一个问题,combobox没有设置为列表视图中的绑定值 从下面的屏幕截图中可以看到,其他值是从绑定中正确填充的。这是否与它是一个组合框而不是一个文本框/标签有关 admin组合有两个选项,true或false。listview(下面的代码)绑定到的datatable包含各种记录的值“True”和“False”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
<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>