Привязка данных к списку внутри объекта, связанного с данными - PullRequest
2 голосов
/ 07 декабря 2008

Я новичок в 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>

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

1 Ответ

5 голосов
/ 07 декабря 2008

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

 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.

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