【问题标题】:Setting the value of a combobox with datasource in ListView在 ListView 中使用数据源设置组合框的值
【发布时间】:2013-10-07 10:16:39
【问题描述】:

我遇到了一个问题,即组合框未设置为列表视图中的绑定值。

从下面的屏幕截图中可以看出,其他值是从绑定中正确填充的。这与它是一个与文本框/标签相对的组合框这一事实有关吗?

管理员组合有两个选项,true 或 false。 listview(下面的代码)绑定的数据表包含各种记录的值“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 和各种类型。

那么,我如何将数据表值绑定到组合,为什么它对组合不起作用而对文本框起作用?

谢谢

【问题讨论】:

  • IsAdmin 是布尔属性吗?如果您的选项是 True 或 False,为什么不使用 CheckBox 来代替?
  • 它以字符串“True”或“False”的形式出现。我试过这个也没有用。

标签: c# wpf xaml listview combobox


【解决方案1】:

这是因为您的 ComboBox 有 2 项 ComboBoxItem 类型而不是 String,这意味着 SelectedItem 也将是 ComboBoxItem 类型。试试这样的:

<ComboBox SelectedItem="{Binding Path=IsAdmin}" Width="55">
   <ComboBox.Items>
      <sys:String>True</sys:String>
      <sys:String>False</sys:String>
   </ComboBox.Items>
</ComboBox>

为此,您需要像这样定义 sys: 命名空间:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

【讨论】:

  • 感谢您,但加载表单时仍然没有显示默认值。下拉项很好,但相对值却没有。
  • @Jacooobley,我已经更新了我的答案。尝试使用 SelectedItem 而不是 Text 并注意这将区分大小写
  • 这很好用!非常感谢 :-) 所以这与我使用的 comboItem 类型有关。非常感谢
【解决方案2】:

如果IsAdmin 是仅包含TrueFalse 的字符串,您可以使用StringToBoolean 转换器简单地将其绑定到CheckBox

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>

【讨论】:

  • 我对 XAML 还比较陌生,所以顶级代码 sn-p 是否需要在解决方案中拥有自己的类?
  • StringToBooleanConverter 是它自己的一个类。根据它的命名空间,您必须包含相关的 using 语句。例如我在命名空间WpfApplication4 下创建它,所以我将语句xmlns:local="clr-namespace:WpfApplication4" 添加到我的xaml 并将其用作&lt;local:StringToBooleanConverter ....
【解决方案3】:

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

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

当然,您需要将此BoolCollection 添加到您绑定到控件的任何对象中,或者更改您的Binding...您也可以创建bool像这样的项目:

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

@dkozl 提到了另一种方法,尽管我相信您仍然需要将 Bind 从您的 IsAdmin 属性转换为 ComboBoxSelectedItem 属性而不是 Text 值。

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2023-03-11
    • 1970-01-01
    • 2016-07-30
    • 2012-04-18
    相关资源
    最近更新 更多