Как связать данные с редактируемым списком wpf: selectedItem, показывающий System.Data.DataRowView - PullRequest
1 голос
/ 19 мая 2010

Я привязал данные к комбинированному списку и определил dataTemplate в itemTemplate. Я могу видеть желаемые значения в раскрывающемся списке комбинированного списка. То, что я вижу в selectedItem - System.Data.DataRowView вот мои коды:

 <ComboBox Margin="128,139,123,0" Name="cmbEmail" Height="23" VerticalAlignment="Top" TabIndex="1" ToolTip="enter the email you signed up with here" IsEditable="True" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}">

            <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                      <TextBlock Text="{Binding Path=username}"/>
                </StackPanel>

            </DataTemplate>
        </ComboBox.ItemTemplate>

Код таков:

 if (con != null)
 {
    con.Open();
    //users table has columns id | username | pass
    SQLiteCommand cmd = new SQLiteCommand("select * from users", con);
    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
    userdt = new DataTable("users");
    da.Fill(userdt);
    cmbEmail.DataContext = userdt;

 }

Я искал что-то вроде SelectedValueTemplate или SelectedItemTemplate, чтобы делать такие же шаблоны данных, но я не нашел ни одного.

Я хотел бы спросить, делаю ли я что-то неправильно или это известная проблема с привязкой к списку?
если что-то не так в моем коде, пожалуйста, укажите мне правильное направление.
спасибо за чтение этого

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

По умолчанию поле со списком вызывает ToString () для выбранного элемента, чтобы получить отображаемое значение - поскольку вы привязываетесь к DataRowView, результатом является тип (поведение по умолчанию ToString ())

То, что вы на самом деле хотите показать, это свойство username выбранного элемента, и для этого вы можете установить DisplayMemberPath в выпадающем списке "username"

(Кроме того, если вы сделаете это, вы, вероятно, обнаружите, что можете избавиться и от пользовательской таблицы данных, поскольку имя пользователя также будет использоваться для заполнения каждого элемента.)


В ответ на ваш комментарий:

Я не хочу быть одним из тех программистов, но "это работает на моей машине".

Мой XMAL:

 <ComboBox Name="cmbEmail" 
            Height="23" 
            VerticalAlignment="Top" 
            TabIndex="1" 
            ToolTip="enter the email you signed up with here"
            IsEditable="True"
            IsSynchronizedWithCurrentItem="True" 
            ItemsSource="{Binding}"
            DisplayMemberPath="username">
  </ComboBox> 

и мой код:

public partial class Window1 : Window
{
    public Window1()
    {
        Users = new DataTable("users");
        Users.Columns.Add("username");

        Users.Rows.Add(CreateDataRow("Fred"));
        Users.Rows.Add(CreateDataRow("Bob"));
        Users.Rows.Add(CreateDataRow("Jim"));

        InitializeComponent();

        cmbEmail.DataContext = Users;
    }

    public DataTable Users { get; private set; }

    private DataRow CreateDataRow(string userName)
    {
        DataRow dr = Users.NewRow();
        dr["username"] = userName;

        return dr;
    }
}
1 голос
/ 07 октября 2010

я получил форму ответа MSDN, и он сделал это для меня

<ComboBox IsEditable="True" ItemTemplate="{StaticResource comboTemplate}" ItemsSource="{Binding}" TextSearch.TextPath="username">

причина была

Поскольку ComboBox установлен в IsEditable = "True", а ComboBox содержит элемент TextBox для отображения выбранного значения. Но элемент в ComboBox имеет тип RowView; он показывает информацию о типе, а не значение в TextBox.

обратите внимание на

TestSearch.TextPath="username"
0 голосов
/ 29 июня 2010

Я выяснил, почему он не работал. Использование DisplayMemberPath не работало, а ItemTemplate. Вот пример.

<Window.Resources>
  <DataTemplate x:Key="comboTemplate">
        <TextBlock Text="{Binding Path=username}" />
  </DataTemplate>
</Window.Resources>
<ComboBox Margin="18,121,24,0" Name="cmbEmail" Tag="email" TabIndex="1" ToolTip="enter the email you signed up with here" IsEditable="True" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource comboTemplate}"  ItemsSource="{Binding}" Height="23" VerticalAlignment="Top" Style="{DynamicResource cmbBoxerrors}">
            <ComboBox.Text>
                <Binding Path="username"/>
            </ComboBox.Text>       
 </ComboBox>

Обратите внимание на ItemTemplate

код xaml.cs не изменился. спасибо тем, кто прочитал и предложил решения для меня.

...