2016-04-22 68 views
2

我需要将对象数组Image s绑定到WrapPanel。使用ItemsControl绑定对象数组

我已经宣布在主类的构造函数的对象:

public MainWindow() 
{ 
    InitializeComponent(); 
    private Masina[] _masina = new Masina[12]; 
    DataContext = new 
    { 
     data1 = _masina 
    }; 
} 

Masina类富人里面的几个变量,但我要绑定只是Image

public class Masina 
{ 
    public Image masina_pav = new Image(); 
    public bool r_mas; 
    public string s_mas; 

    public Masina() 
    { 
     byte[] buffer = File.ReadAllBytes("teksturos/masinos/red/top.png"); 
     MemoryStream memoryStream = new MemoryStream(buffer); 

     BitmapImage bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.DecodePixelWidth = 100; 
     bitmap.DecodePixelHeight = 200; 
     bitmap.StreamSource = memoryStream; 
     bitmap.EndInit(); 
     bitmap.Freeze(); 

     masina_pav.Source = bitmap; 

     Canvas.SetLeft(masina_pav, 100); 
     Canvas.SetTop(masina_pav, 200); 
    } 
} 

我已经试过这XAML代码:

<WrapPanel Name="zem" Height="1000" Width="1108" > 
     <ItemsControl ItemsSource="{Binding data1}" DisplayMemberPath="masina_pav"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <WrapPanel Name="masinu_sarasas" HorizontalAlignment="Center" IsItemsHost="True" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
</WrapPanel > 

现在程序开始,但不要告诉我任何Image(应该是其中的12个)。有人能帮我弄清楚吗?

+0

它显示图像类名吗? –

+0

您正在使用字段,使用属性。 – Wobbles

回答

1

Image是不应在视图模型中使用的视图类。相反,您的班级应提供ImageSource类型的公共财产。请注意,这是属性,而不是您声明的字段。这是必要的,因为WPF数据绑定仅适用于公共属性。

public class Masina 
{ 
    public ImageSource MasinaPav { get; private set; } 
    ... 

    public Masina() 
    { 
     using (var fileStream = new FileStream(
      "teksturos/masinos/red/top.png", 
      FileMode.Open, FileAccess.Read, FileShare.Read)) 
     { 
      var bitmap = new BitmapImage(); 
      bitmap.BeginInit(); 
      bitmap.DecodePixelWidth = 100; 
      bitmap.DecodePixelHeight = 200; 
      bitmap.StreamSource = fileStream; 
      bitmap.EndInit(); 
      bitmap.Freeze(); 

      MasinaPav = bitmap; 
     } 
    } 
} 

现在你的ItemsControl将有ItemTemplate与被绑定到视图模型性的图像控制:

<ItemsControl ItemsSource="{Binding data1}"> 
    ... 
    <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Image Source="{Binding MasinaPav}"/> 
      </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

除此之外,你应该小心设置的BitmapImage的DecodePixelWidthDecodePixelHeight,因为它可能会破坏位图的宽高比。