2013-12-19 241 views
0
<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
x:Class="Menupedia.MiniRestaurantViewer" 
x:Name="UserControl" Width="80" Height="100"> 

<Grid x:Name="LayoutRoot"> 
    <Label x:Name="label_Name" Content="{Binding _name, Mode=OneWay}" HorizontalAlignment="Stretch" Width="80" FontFamily="Public Enemy NF" FontSize="14.667" Foreground="#FFEF7B54" Margin="0" Height="20" VerticalAlignment="Bottom"/> 
    <Image x:Name="image_Logo" Source="{Binding _logo, Mode=OneWay}" HorizontalAlignment="Left" Width="80" Height="80" VerticalAlignment="Top"/> 
    <Border BorderBrush="#FFF15A28" BorderThickness="1" Height="80" CornerRadius="2" VerticalAlignment="Top" Width="80" HorizontalAlignment="Left"/> 
</Grid> 

WPF自定義控件不綁定

public partial class MiniRestaurantViewer : UserControl 
{ 
    public int _id {get{return id;}} 
    public string _name {get{return name;}} 
    public ImageSource _logo {get{return logo;}} 

    public MiniRestaurantViewer(int id, string name,byte[] logo) 
    { 
     this.id = id; 
     this.name = name; 
     this.logo = ByteArrayToImageSource(logo); 
     this.InitializeComponent(); 
    } 

    private int id; 
    private string name; 
    private ImageSource logo; 

    private ImageSource ByteArrayToImageSource(byte[] data) 
    { 
     BitmapImage image = null; 
     if (null != data) 
     { 
      image = new BitmapImage(); 
      image.BeginInit(); 
      image.StreamSource = new System.IO.MemoryStream(data); 
      image.EndInit(); 
     } 
     return image; 
    } 

    public MiniRestaurantViewer() 
    { 
     this.InitializeComponent(); 
    } 
} 

這是我的自定義控制。我想這樣做

ListBox.Items.Add(new MiniRestaurantViewer(1,"test",null)); 

當我這樣做,我看到的UI元素,但它是空的(綁定不起作用)。通過手錶,雖然我發現公共財產有價值..我不知道如何使它的工作,我一直試着從3天請幫助我。 :(

回答

2

您需要設置DataContext to itself如果屬性在於後面的代碼

<UserControl x:Class="Menupedia.MiniRestaurantViewer" 
      x:Name="UserControl" Width="80" Height="100" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
+1

生病給它一個鏡頭謝謝 –

+0

您的歡迎AymanSalah .. :) –

2

你可以做到這一點this.DataContext = this;,使你的代碼的作品,但你是遠遠離這意味着使用MVVM嘗試讀取this第一,因爲它可以是一個良好的開端,一個begineer

WPF的最佳實踐
public MiniRestaurantViewer(int id, string name,byte[] logo) 
    { 
     this.id = id; 
     this.name = name; 
     this.logo = ByteArrayToImageSource(logo); 
     this.InitializeComponent(); 
     this.DataContext = this; 

    } 
+0

非常感謝我知道我遠離良好的代碼。但即時通訊新的wpf和我有一個項目由於下一個星期一,我必須使它的工作,我選擇使用WPF而不是Windows窗體,所以即時通訊學習一起開發這個程序。生病閱讀你的鏈接 –

1

首先,我認爲你需要使用雙向綁定,能夠作出改變兩者的方式 - 從您的視圖模型並從模型中查看id在你的控件列表框中看不到,所以可能是你的mainWindow。在這種情況下,你有兩個oportunities - 或者設置mainWindow的datacontext,就像在下面的答案中一樣,或者設置ListBox.Datacontext。希望這會幫助你。