Установка экземпляра объекта для текущего элемента данных - PullRequest
0 голосов
/ 05 июля 2011

Я довольно новичок в WPF, уже пару дней безуспешно работаю над поиском ответа на этот вопрос, похоже, должен быть выход.Я установил DataTemplate, DataType которого является моим собственным классом.В рамках определения DataTemplate я настроил сбор ресурсов с помощью.Я сделал это потому, что хочу создать ObjectDataProvider, который будет доступен элементам управления в DataTemplate - я хочу, чтобы ObjectInstance этого ObjectDataProvider был в настоящее время связанным элементом данных (текущим экземпляром в списке моего пользовательского класса) - потому чтотогда я хочу иметь возможность запускать метод для текущего экземпляра данных - когда пользователь изменяет текст в текстовом поле, которое является частью DataTemplate.Трудно объяснить, но это должно прояснить ситуацию, вот мой xaml:

    <DataTemplate x:Key="TierDisplay" DataType="{x:Type tiers:PopulatedTier}">
        <DataTemplate.Resources>
            <ObjectDataProvider x:Key="FilteredItems"  MethodName="GetDisplayItems">
                <ObjectDataProvider.MethodParameters>
                    <sys:Int32>0</sys:Int32>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider> 
        </DataTemplate.Resources>
        <StackPanel Orientation="Vertical">
            <TextBox Name="txtMaxSupplyDays" LostFocus="txtMaxSupplyDays_LostFocus"></TextBox>
            <DataGrid ItemsSource="{Binding Source={StaticResource FilteredItems}}" />
        </StackPanel>
    </DataTemplate>   

Каждый экземпляр DataTemplate связан с экземпляром класса PopulatedTier.Когда пользователь покидает текстовое поле txtMaxSupplyDays, у меня есть код в выделенном коде, чтобы взять введенное им значение и поместить его в первый MethodParameter моего ObjectDataProvider (ключ которого - FilteredItems).Это отлично работает с использованием кода C # ниже, код находит FilteredItems и вставляет нужное значение в MethodParameter.Но я не могу понять, как связать FilteredItems с текущим экземпляром PopulatedTier, чтобы его GetDisplayItems работал.(Если бы это работало, то, вероятно, DataGrid обновился бы, используя вывод GetDisplayItems в качестве своего ItemsSource.) Фактически, в C # ниже он находит / распознает свойство DataContext текстового поля (отправителя) как экземпляр PopulatedTier.Но как я могу сослаться на это в XAML в определении ObjectDataProvider?СПАСИБО и дайте мне знать, если я могу уточнить дальше.Конечно, приветствуются альтернативные предложения;Я хотел бы сохранить как можно больше в XAML и коде позади.

    private void txtMaxSupplyDays_LostFocus(object sender, RoutedEventArgs e)
    {
        var textBox = sender as TextBox;
        if (textBox == null) return;
        int value;
        bool valueOK = Int32.TryParse(textBox.Text, out value);

        if (valueOK)
        ((ObjectDataProvider)textBox.FindResource("FilteredItems")).MethodParameters[0] = value;
    }

1 Ответ

0 голосов
/ 06 июля 2011

У вас есть правильные мысли о вашем коде позади - он должен быть как можно меньше.Это один из слоганов паттерна MVVM, вот что вам нужно - выучить MVVM.В Интернете много ресурсов, поэтому найти его не составит труда.

...