免責事項: はい、OP の写真に WinForms が表示されていることは知っていますが、他の質問では、OP は のチュートリアルに従っていると述べていますYouTube
。私は、彼が WPF を使用して同じデータを表現できる別の方法を提供したいと考えました。
;を処理する代わりに、を使用しModel
てそれぞれの を表示できます。Object-Relational Mapping、Entity-Framework、NHibernate などをご覧ください。DataTypes
Raw Data
Product
テーブルからのデータを保持するモデルを作成しProduct
ます。
public class Product {
public int ProductID {get;set;}
public int ProductType { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public byte[] Image { get; set; }
}
Product Type
テーブルからのデータを保持するモデルを作成しProduct Type
ます。
public class ProductType {
public int ProductTypeID { get; set; }
public string Description { get; set; }
}
を保持するWindow
/を作成します。UserControl
TabControl
<Window.Resources>
<local:ProductConverter x:Key="ProductConverter" />
<local:ProductTypeConverter x:Key="ProductTypeConverter" />
</Window.Resources>
<TabControl ItemsSource="{Binding MyProducts,
Converter={StaticResource ProductConverter}}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource ProductTypeConverter}">
<Binding Path="ProductType"/>
<Binding Path="DataContext.MyProductTypes"
RelativeSource="{RelativeSource AncestorType={x:Type Window}}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Width="150" Content="{Binding Description}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
ItemTemplate
andを使用するとContentTemplate
、すべてのProduct
オブジェクトが同じ形式とスタイルを持つようになります。
これは、値に基づいて のリスト全体を のProducts
グループに変換するコンバータです。Products
Product Type
public class ProductConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if(value as List<Product> != null) {
return (value as List<Product>).GroupBy(a => new { a.ProductType });
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
return null;
}
}
これは、Product.ProductType
値をProductType.Description
public class ProductTypeConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
if(values[0] != null && values[0] != DependencyProperty.UnsetValue &&
values[1] != null && values[1] != DependencyProperty.UnsetValue) {
string f= (values[1] as List<ProductType>)
.Where(a => a.ProductTypeID.Equals(values[0]))
.First().Description;
return f;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
return null;
}
}
の表示に使用するプロパティを作成しますTabControl.Items
。
public List<Product> MyProducts { get; set; }
public List<ProductType> MyProductTypes { get; set; }
あとはRaw Data
、モデル形式で表現するだけです。(私のSQLは少し不安定です)
SqlCommand sqlCmdProducts = new SqlCommand("SELECT * FROM TblProduct", myConnection);
SqlDataReader productReader = sqlCmdProducts.ExecuteReader();
while (productReader.Read()) {
MyProductTypes.Add(new ProductType() {
ProductTypeID = Int32.Parse(productReader["ProductType"].ToString()),
Description = Int32.Parse(productReader["Description"].ToString()),
};
}
SqlCommand sqlCmdProductType = new SqlCommand("SELECT * FROM TblProductType", myConnection);
SqlDataReader productTypeReader = sqlCmdProductType.ExecuteReader();
while (productTypeReader.Read()) {
MyProducts.Add(new Product() {
ProductID = Int32.Parse(productTypeReader["ProductID"].ToString()),
ProductType = Int32.Parse(productTypeReader["ProductType"].ToString()),
Description = productTypeReader["Description"].ToString()),
Price = double.Parse(productTypeReader["Price"].ToString()),
};
}