2013-10-07 1 views
0

У меня проблема, когда combobox не устанавливает значение привязки в виде списка.Установка значения combobox с источником данных в ListView

Как видно из приведенного ниже скриншота, другие значения заполняются правильно. Это связано с тем, что это combobox против текстового поля/метки?

enter image description here

комбо админы имеют два варианта, истинный или ложный. Тип данных, к которому привязан список (код ниже), содержит значения «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 с комбо и почему оно не работает для комбо и для текстовых полей?

Благодаря

+0

Является ли 'IsAdmin' логической собственностью? если ваши варианты True или False, почему вы не используете CheckBox вместо этого? –

+0

Он проходит через строку «True» или «False». Я пробовал это, что тоже не сработало. – Jacooobley

ответ

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" 
+0

Спасибо за это, но по-прежнему не отображается значение по умолчанию при загрузке формы. Выпадающие элементы выдаются в порядке, но относительные значения этого не делают. – Jacooobley

+1

@ Jacooobley, я обновил свой ответ. Попробуйте использовать 'SelectedItem' вместо' Text' и помните, что это будет чувствительно к регистру – dkozl

+0

Это работает отлично! Большое спасибо :-) Так что это было связано с типом comboItem, который я использовал. Очень признателен – Jacooobley

0

Если IsAdmin является строка, содержащая только True или False, вы можете просто привязать его к 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> 
+0

Я довольно новичок в XAML, так что бы лучший фрагмент кода нуждался в собственном классе в решении? – Jacooobley

+0

'StringToBooleanConverter' - это класс его собственных. В зависимости от пространства имен вам нужно будет включить соответствующий оператор using. Например, я создал его под пространством имен 'WpfApplication4', поэтому я добавил оператор xmlns: local =" clr-namespace: WpfApplication4 "в мой xaml и использовал его как'

0

Есть несколько способов, чтобы исправить вашу проблему. Лично я предпочел бы использовать фактические свойства bool для представления булевых значений. Используя этот метод, вы должны были бы Bind к bool коллекции, содержащей ваши trueиfalse значения в нем, а затем Bind вашей IsAdmin собственности (если бы это было типа bool) к SelectedItem свойству ComboBox вместо.

<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 имущества в SelectedItem собственности ComboBox вместо от значения Text.

Смежные вопросы