Доступ к переменным пользовательских классов в ViewModel через привязку - PullRequest
0 голосов
/ 02 декабря 2019

То, что я хочу сделать, - это иметь возможность доступа к свойствам объекта через связанный текстовый блок, который находится в классе viewModel. Допустим, я хочу получить доступ к OrderID класса Orders в связанном текстовом блоке, который хранится в классе viewModel. Для этого у меня есть:

<textblock text="{Binding Path=Order.OrderID}"/>

Это связано с orderID заказа, так как при изменении OrderID в классе ViewModel изменение отражается в текстовом блоке. Проблема возникает, когда я пытаюсь загрузить OrderID из другого класса.

Другой класс:

public class ModifyOrder
{
   private ViewModel boundData;
   public ModifyOrder()
   {
      boundData = new ViewModel();
   }

   public void ChangeOrderID()
   {
      boundData.Order.OrderID = 10;
   }
}

Изменения не передаются статическому _Order в классе ViewModel.

Это класс viewModel:

public class ViewModel : INotifyPropertyChanged
{
   private Orders _Order;
   public Orders Order
   {
      get { return _Order; }
      set 
      { 
         if (_Order != value)
         {
            _Order = value;
         }
      }
   }

   public ViewModel()
   {
      Order = new Orders();
   }

   public event PropertyChangedEventHandler PropertyChanged;
   private void OnPropertyChanged([CallerMemberName] string propertyName = null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}

У меня есть класс ViewModel, загруженный в DataContext пользовательского интерфейса, и мои другие связанные переменные в классе ViewModel работают нормально, но по какой-либо причине либо связанный текстовый блокне получает доступ к Order.OrderID (что, я не думаю, является проблемой, так как я могу изменить Order.OrderID в классе ViewModel, и изменения будут отражены) ИЛИ класс, который изменяет мой Order, не может изменитьOrderID.

Я уже пытался загрузить новый класс Order с новым OrderID, а затем попытался загрузить _Order в ViewModel с новым ордером ModifyOrder, но это тоже не сработало.

Это класс Orders:

public class Orders : INotifyPropertyChanged
{
   private int _OrderID;
   public int OrderID 
   { 
      get { return _OrderID; } 
      set 
      {
         if(_OrderID != value)
         {
            _OrderID = Value
            OnPropertyChanged(nameof(OrderID));
         }
      } 
   }

   public event PropertyChangedEventHandler PropertyChanged;
   private void OnPropertyChanged([CallerMemberName] string propertyName = null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}
<Page x:Class="SPWally.FunctionalPages.LookupOrders"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:SPWally.FunctionalPages"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="LookupOrders">

    <Grid Background="AliceBlue">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="20"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" Text="Search For Order" />

        <TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,335,0" Text="OrderID: " />
        <TextBox Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Width="300" Margin="0,0,20,0" Text="{Binding Path=OrderIDSearch, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />

        <Button Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="40" Height="20" Margin="10,0,0,0" Content="Find" Click="Find_Click" />
        <Button Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="50" Height="20" Margin="70,0,0,0" Content="Refund" Click="Refund_Click" />

        <TextBlock Grid.Row="3" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="OrderID:"/>
        <TextBlock Grid.Row="4" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="Customer:"/>
        <TextBlock Grid.Row="5" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="Product:"/>
        <TextBlock Grid.Row="6" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="Branch:"/>
        <TextBlock Grid.Row="7" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="Sales Price:"/>
        <TextBlock Grid.Row="8" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,100,0" Text="Quantity:"/>

        <TextBlock Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.OrderID, Mode=TwoWay}"/>
        <TextBlock Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.Customer.FullName, Mode=TwoWay}"/>
        <TextBlock Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.Product.ProductName, Mode=TwoWay}"/>
        <TextBlock Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.Branch.BranchName, Mode=TwoWay}"/>
        <TextBlock Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.SalesPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBlock Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Margin="30,0,0,0" Text="{Binding Path=Order.Stocks, Mode=TwoWay}"/>

        <Button Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="60" Height="25" Content="Cancel" Command="{x:Static NavigationCommands.BrowseBack}" />
    </Grid>
</Page>

Имейте в виду, что я буквально выучил все, что я знаю о привязке данных в tон последние 48 часов, так что терпите меня здесь.

Любая помощь вообще очень ценится. Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Где создается ваша модель представления? Я полагаю, поскольку вы воссоздаете свой экземпляр viewmodel в классе ModifyOrder *, привязка boundData = new ViewModel(); потеряна и может быть из-за того, что она не отображается.

0 голосов
/ 02 декабря 2019

Вам необходимо реализовать INotifyPropertyChanged в классе Orders. Вам нужно вызвать OnPropertyChanged () внутри всех сеттеров.

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