在ListView中使用数据源设置组合框的值

时间:2013-10-07 10:16:40

标签: c# wpf xaml listview combobox

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

从下面的屏幕截图中可以看到,其他值正确地从绑定中填充。是否与文本框/标签相对的组合框有什么关系呢?

enter image description here

admin combo有两个选项,true或false。列表视图(下面的代码)绑定的数据表包含各种记录的值“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和所有排序。

那么,我如何将数据表值绑定到组合,为什么它不适用于组合并且对文本框有效?

由于

3 个答案:

答案 0 :(得分:1)

这是因为您的ComboBox有两项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"

答案 1 :(得分:0)

如果IsAdmin是仅包含TrueFalse的字符串,则只需使用CheckBox转换器将其绑定到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>

答案 2 :(得分:0)

有多种方法可以解决您的问题。就个人而言,我更愿意使用实际的bool属性来表示布尔值。使用此方法,您需要Bindbool集合,其中包含您的true false值,然后{{1将Bind属性(如果类型为IsAdmin)改为bool的{​​{1}}属性。

SelectedItem

当然,您需要将此ComboBox添加到绑定到控件的任何对象中,或者更改您的<ComboBox ItemsSource="{Binding BoolCollection}" SelectedItem="{Binding IsAdmin}" /> ...您可以像这样创建BoolCollection个项目:

Binding

@dkozl已经提到了一种替代方法,但我相信您仍需boolxmlns:System="clr-namespace:System;assembly=mscorlib" ... <ComboBox.Items> <System:Boolean>True</System:Boolean> <System:Boolean>False</System:Boolean> </ComboBox.Items> 属性到Bind IsAdmin属性而不是SelectedItem值。

相关问题