Потратив много времени на получение значений свойств объекта в текстовые поля - PullRequest
0 голосов
/ 06 апреля 2010

Я новичок в модели проектирования MVVM и работаю над проектом по автоматизации процессов доставки.

Особая проблема, с которой я сталкиваюсь, заключается в том, что у меня есть UserControl (мой EditShipmentView), который при загрузке назначает свой ViewModel своему DataContext. ViewModel передается recordID, который используется для извлечения объекта, представляющего поставку. Он делает это успешно, как я вижу в Mole (визуализаторе).

Ниже приведен фрагмент XAML, показывающий первую пару TextBox и то, как я думал, что привязки должны выглядеть.

<local:SnazzyForm Background="#FF318AE1">

    <Grid Margin="6,0,0,0">

        <TabControl Style="{DynamicResource SnazzyTabControl}" TabStripPlacement="Left" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,0,50">
            <TabItem Header="Overview" Style="{DynamicResource TransparentTabItems}">
                <Grid Margin="6,0,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <StackPanel DataContext="{Binding Path=ShipmentRecord}">
                        <TextBlock HorizontalAlignment="Left" Text="Contact Info" TextWrapping="Wrap" Style="{DynamicResource TitleText}"/>
                        <Path Fill="#FFFFB900" Stretch="Fill" HorizontalAlignment="Left" Width="200" Height="2" Data="M0,16.5 L278.5,16.5" Stroke="#FFFFB900"/>
                        <StackPanel Margin="0,10,0,0">
                            <Grid Margin="0,16,0,0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width=".40*"/>
                                    <ColumnDefinition Width=".60*"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock HorizontalAlignment="Right" Text="Company" TextWrapping="Wrap" VerticalAlignment="Top" Style="{DynamicResource FieldLabel}" TextAlignment="Right" Margin="0,2,9,0"/>
                                <TextBox Text="{Binding Path=CompanyName, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1"/>
                            </Grid>
                            <Grid Margin="0,16,0,0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width=".40*"/>
                                    <ColumnDefinition Width=".60*"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock HorizontalAlignment="Right" Text="Contact" TextWrapping="Wrap" VerticalAlignment="Top" Style="{DynamicResource FieldLabel}" TextAlignment="Right" Margin="0,2,9,0"/>
                                <TextBox Grid.Column="1" Text="{Binding Path=ContactName}" TextWrapping="Wrap" d:LayoutOverrides="Height"/>
                            </Grid>

Итак, подведем итоги ... EditShipmentView (Наследует от SnazzyForm) DataContext - это EditShipmentViewModel EditShipmentViewModel.ShipmentRecord (успешно) заполняется объектом отгрузки ShipmentRecord.CompanyName - это строка, которая, очевидно, должна возвращать название компании.

Имейте в виду, что это только моя последняя попытка. Ранее я не связывал DataContext с Stackpanels и имел текстовые поля, связанные как «{Binding Path = ShipmentRecord.CompanyName}», и то, что кажется сотней различных вариантов. То, что у меня осталось, быстро спадает. Пожалуйста, подумай о моих волосах, отправь помощь.

Cory

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

Покажите нам свой код? Скорее всего, ваша модель представления просто не уведомляет представление при его изменении. Если ваши привязки неверны (не разрешены), вы увидите выходные данные с этим эффектом в окне вывода отладочной информации Visual Studio. Проверьте это также.

0 голосов
/ 06 апреля 2010

Убедитесь, что EditShipmentViewModel (вероятный виновник) и ShipmentRecord реализуют INotifyPropertyChanged .

Если данные загружаются после настройки начального представления, а класс EditShipmentViewModel не вызывает событие PropertyChanged для ShipmentRecord, то представление (xaml) никогда не узнает об обновлении привязки, и вы ' увидим пустую строку.

...