2013-12-19 4 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)); 

, когда я это сделать я вижу элемент пользовательского интерфейса, но он пустой (связывание не работает). Через часы, хотя я нахожу, что публичные свойства имеют значения. Я не знаю, как заставить его работать, и я пробовал с 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

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

    } 
+0

спасибо большое, я знаю im far from good code. но im new для wpf, и у меня есть проект, следующий в понедельник, и я должен заставить его работать. Я решил использовать wpf, а не формы Windows, поэтому я все-таки изучил все вместе с разработкой этой программы. плохо читал ur link –

1

Прежде всего, я думаю, вам нужно использовать два пути привязки, чтобы иметь возможность вносить изменения как путь. - с вашей точки зрения модели и от модели к виду. id не видит в вашем контроле Listbox, так что, вероятно, это из вашего mainWindow. В этом случае у вас есть две возможности - или установить datacontext для mainWindow, как в ответах ниже, или установить ListBox.Datacontext. Надеюсь, что это поможет вам.

Смежные вопросы