使用ItemsControl绑定对象数组

时间:2016-04-22 19:15:57

标签: c# wpf xaml data-binding

我需要将对象html, body { margin: 0; height: 100%; }的数组绑定到WrapPanel。

我在主类构造函数中声明了对象:

Image

我的班级public MainWindow() { InitializeComponent(); private Masina[] _masina = new Masina[12]; DataContext = new { data1 = _masina }; } 里面有几个变量,但我想只绑定Masina

Image

我试过这个XAML代码:

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);
    }
}
  

现在程序启动但不显示任何<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 > (应该是12个)。有人能帮我解决一下吗?

1 个答案:

答案 0 :(得分: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,其中一个Image控件绑定到视图模型属性:

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

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