Почему привязка данных не работает? - PullRequest
1 голос
/ 14 декабря 2010

У меня есть автомобиль такого класса:

public class car
{
    public String Name {get; private set;}

    public car(string name)
    {
      this.Name = name;
    }
}

У меня также есть пользовательКонтроль:

public partial class CarListItem : UserControl
{
    private Car car;

    public CarListItem (Car car)
    {
        InitializeComponent();
        this.car= car;
    }

}

С xaml:

<Grid>
     <Label Content="{Binding Path=car.Name}" Name="lblCarName"/>
</Grid>

нопривязка данных не работает.Что я делаю не так?

Я хочу показать название автомобиля на пользовательском контроле.

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Вам не нужно вводить предисловие выражения к машине ...

<Grid>
     <Label Content="{Binding Name}" Name="lblCarName"/>
</Grid>

... кроме того, вам нужно установить DataContext вашего UserControl

public partial class CarListItem : UserControl
{
    public CarListItem (Car car)
    {
        InitializeComponent();

        this.DataContext = car;
    }
}

Также я предполагаю, что вы передаете имя в ctor автомобиля, а не пустую строку или ноль.

1 голос
/ 14 декабря 2010

Чтобы привязка работала, вам нужно иметь значение в свойстве DataContext Control. Это также может быть унаследовано. Таким образом, дочерние элементы управления также могут получить доступ к родительскому элементу DataContext, если у него его нет.

Свойства (даже не публичные) не помогают с привязкой, если не используются с Self Binding.

Чтобы ваш код работал,

Заменить

this.car = car;

С

this.DataContext = car;

И заменить

<Label Content="{Binding Path=car.Name}" Name="lblCarName"/>

С

<Label Content="{Binding Path=Name}" Name="lblCarName"/>
0 голосов
/ 14 декабря 2010

Использование this.DataContext будет работать , но оно хрупкое и ужасное и не является хорошим способом для разработки вашего приложения.Если бы я использовал ваш пользовательский элемент управления и написал следующее xaml:

<CarListItem DataContext="{Binding MyThing}" />

..., тогда ваш элемент управления сломался бы, независимо от того, правильно ли установлено свойство Car или нет.Это не очень красиво.

Более надежный подход - пометить элемент UserControl в Xaml символом x:Name и использовать ElementName в привязке.Итак, ваш элемент управления выглядит примерно так:

<UserControl x:Name="control" ....... (namespaces/etc here)>
  <Grid>
    <Label Content="{Binding Car.Name, ElementName=control}" Name="lblCarName"/>
  </Grid>

Теперь, если вы хотите установить DataContext на Grid (используя DataContext="{Binding Car, ElementName=control}"), вы можете получить преимущество datacontext в болеенадежный способ.

Однако для того, чтобы все это работало, вы должны выставлять свое поле car как свойство, а не просто как поле.Вам также необходимо реализовать INotifyPropertyChanged, чтобы пользовательский интерфейс понимал, когда вы изменяете значение свойства, хотя вы можете временно обойти это, установив car до , который вы вызываете InitializeComponent() в конструкторе.

0 голосов
/ 14 декабря 2010

Ваше связывание привязывается к текстовому тексту car.Name.В вашем случае DataContext имеет значение NULL.

У вас есть несколько вариантов:

  1. Установите для контекста данных значение CarListItem instance
  2. Укажите источник привязки.

Первый вариант обычно лучше.

Еще лучше было бы определить DataTemplate для вашего Car и использовать список Car s вместо явногоCarListItem s:

<DataTemplate DataType="{x:Type local:Car}">
    <Grid>
        <Label Content="{Binding Path=Name}"/>
    </Grid>
</DataTemplate>

Теперь вы можете использовать этот шаблон как ItemTemplate в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...