2008-12-07 3 views
2

Я новичок в WPF и привязке данных, поэтому, надеюсь, я могу объяснить проблему, с которой у меня есть достаточно деталей, чтобы получить некоторую помощь.Связывание данных со списком внутри объекта, связанного с данными

У меня есть список объектов, привязанных к окну. Скажем, его список рецептов. Мне удалось заставить приложение отображать некоторые детали каждого рецепта в списке, а также некоторые подробности выбранного рецепта в различных текстовых полях. Моя проблема в том, что у меня есть список ингредиентов в каждом рецепте, который я хочу отобразить в другом списке, когда выбран рецепт, но я не могу понять, как заставить привязывать данные к работе.

Мои классы данных выглядеть примерно так:

public class Recipes : ObservableCollection<RecipeDetails> 
{ 
} 

public class RecipeDetails 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public List<RecipeIngredient> Ingredients; 
} 

public class RecipeIngredient 
{ 
    public string IngredientName { get; set; } 
} 


public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     m_recipes = new Recipes(); 
     // m_recipes initialisation 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataContext = m_recipes; 
    } 

    private Recipes m_recipes; 
} 

И мои привязки данных попыток (в XAML) выглядеть примерно так:

<Window x:Class="RecipeWindow.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Recipe Window" Height="402.687" Width="532.674" Loaded="Window_Loaded"> 
    <Grid> 
     <ListBox Margin="12,58.176,0,16.362" Name="recipeListBox" Width="209.07" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Name}" FontSize="14" Padding="5" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <StackPanel Margin="245.43,58.176,12,47.268" Name="detailsPanel"> 
      <TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}" Width="140" /> 
      <TextBox Text="{Binding Description,UpdateSourceTrigger=PropertyChanged}" Width="140" /> 
      <ListBox Name="ingredientListBox" Width="209.07" ItemsSource="{Binding Ingredients}" Height="118.17"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding IngredientName}" Padding="5" /> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </StackPanel> 
    </Grid> 
</Window> 

Но когда я пытаюсь запустить этот код, список ингредиентов поле всегда пустое. Может ли кто-нибудь сказать мне, что я делаю неправильно?

ответ

5

Проблема в том, что, как вы объявить и инициализировать Ингредиенты список, сделать его как ObservableCollection и инициализировать коллекцию ингредиенты только в конструкторе следующим образом

public class RecipeDetails 
{ 
    public RecipeDetails() 
    { 
     _ingredients = new ObservableCollection<RecipeIngredient>(); 
    } 

    public string Name { get; set; } 
    public string Description { get; set; } 

    private ObservableCollection<RecipeIngredient> _ingredients; 

    private ObservableCollection<RecipeIngredient> Ingredients 
    { 
     get { return _ingredients; } 
    } 
} 

еще один пункт, чтобы добавить к вашему подходу, это рекомендуется использовать INotifyPropertyChanged в этом классе, чтобы привязка TwoWay была легко достижима здесь, когда вы вводите что-то в TextBox.

+0

Работал как шарм, за исключением того, что мне не нужно инициализировать его в конструкторе. Сделать его общедоступным, например: public ObservableCollection Ингредиенты {get; задавать; } , похоже, работает нормально. – Bonnici 2008-12-07 08:49:45

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