Derek Kennard Ответов: 1

Привязка пункта меню из базы данных SQL-WPF/C#


Здравствуйте Разработчики,
У меня есть проблема с пунктом меню WPF/C#. Я хочу, чтобы пункты меню заполнялись из базы данных SQL. У меня есть следующий код. Скорее всего, мне не хватает чего-то в XAML для привязки данных из базы данных к окну, но давайте посмотрим, что вы думаете.

Фрагмент Кода C#
const string sql = "SELECT DISTINCT [PT].[PhysTypeCode], [PT].[PhysTypeDesc], 0 AS [ParentID] FROM [dbo].[PhysicianTypes] AS [PT] WHERE [PT].[PhysTypeDesc] <> '-- Select --' ORDER BY [PT].[PhysTypeDesc] ASC;";
			Log.Debug("SP: " + sql + " for GetPhysTypes()");
			Log.Debug("Dbconn called and created for GetPhysTypes()");
			var connectionString = Settings.Default.Dbconn;
			using (var conn = new SqlConnection(connectionString))
			using (var cmd = new SqlCommand(sql, conn))
			{
				try
				{
					conn.Open();
					using (var adapter = new SqlDataAdapter(cmd))
					{
						var ds = new DataSet();
						var dt = new DataTable();
						adapter.Fill(ds);
						dt = ds.Tables[0];
						var mbar = dt.Select("ParentID=" + 0);

						foreach (var dr in mbar)
						{
							MiTypeAc.Items.Add(new MenuItem(dr["PhysTypeDesc"].ToString()));
						}
						Log.Debug("Command executed and reader completed for GetPhysTypes()");
											}
				}
				catch (SqlException ex)
				{...//more code in the catch, but not important here...


Вызов GetPhysTypes

private void MiTypeAc_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    GetPhysTypes();
}


Теперь та часть, которую я действительно ненавижу (главным образом потому, что я не совсем хорошо понимаю привязку)
XMAL

<MenuItem Header="By Type">
<MenuItem x:Name="MiTypeAc" Header="A-C" ItemsSource="{Binding PhysTypeDesc}" Loaded="MiTypeAc_Loaded"/>
</MenuItem>


Происходит следующее: окно загружается, я перехожу к меню, и меню открывается с большой областью (по вертикали примерно так будет выглядеть 21 запись - 21 запись-это количество записей из инструкции SQL), но оно пусто. Итак, запрос работает, C# работает (я думаю), но привязки данных к окну нет... оно пустое...

мысли?

Обновление: я получаю данные из SQL, так что это должна быть проблема с получением данных из C# в XAML...

Отладчик: mbar = {System.Data. DataRow[21]}
Отладчик: mbar[0].ItemArray[1] = " Ассистент Анестезиолога"

Что я уже пробовал:

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

1 Ответов

Рейтинг:
1

Derek Kennard

Я решил свою собственную проблему. Я решил пойти по маршруту массива.

<menuitem header="By Type" x:name="MiTypeAc" itemssource="{Binding Col2}" loaded="MiTypeAc_Loaded" xmlns:x="#unknown">
<menuitem.itemcontainerstyle>
	<style>
		<setter property="MenuItem.Header" value="{Binding Col2}" />
		<!--<Setter Property="MenuItem.Command" Value="{Binding Open}"/>-->
	</style>
</menuitem.itemcontainerstyle>
</menuitem>


public class Items
   {
       public string Col1 { get; set; }
       public string Col2 { get; set; }
   }


				try
				{
					Items[] items = null;
					conn.Open();
						using (var reader = cmd.ExecuteReader())
						{
							var list = new List<items>();
							while (reader.Read())
								list.Add(new Items { Col2 = reader.GetString(1) });
							items = list.ToArray();
							MiTypeAc.ItemsSource = items;
						}

						Log.Debug("Command executed and reader completed for GetPhysTypes()");
				}
</items>