Некоторые проблемы с двусторонним связыванием - не работает должным образом в UWP - PullRequest
1 голос
/ 04 февраля 2020

Проблема: Когда местоположение изменяется с помощью ComboBox cb1, связанное местоположение TextBlock не изменяется на обновленное значение.

Я самообучаюсь и ниже приведен код эксперимента по привязке, который опубликован c EmpDeptViewModel vm; его инициализация при нажатии кнопки, как показано ниже

private void btn2_Click(object sender, RoutedEventArgs e) { 
vm = new EmpDeptViewModel();
this.Bindings.Update();  }

XAML выглядит следующим образом.

 <ListView x:Name="listview3" ItemsSource="{x:Bind vm.InstanceOfDepartmentData}">
                        <ListView.ItemTemplate>
                            <DataTemplate x:DataType="classes:Department">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Margin="5">
                                            <Run Text="DeptNo: " /><Run Text="{x:Bind DeptNo}" />
                                    </TextBlock>
                                    <TextBlock Margin="5">
                                            <Run Text="DeptName: " /><Run Text="{x:Bind DeptName}" />
                                    </TextBlock>

                                    <TextBlock Margin="5">
                                            <Run Text="Location: " /><Run Text="{x:Bind Location, Mode=OneWay}" />
                                    </TextBlock>

                                    <ComboBox  x:Name="cb1" ItemsSource="{Binding Source={StaticResource MyLocatonList}, Path=ListofLocationsInsideViewModel, Mode=TwoWay}" DisplayMemberPath="LocationName" SelectedValuePath="LocationName"  SelectedValue="{x:Bind Location}"  />
  </StackPanel>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

Проблема: при изменении местоположения через ComboBox cb1 соответствующее местоположение TextBlock не изменить на обновленное значение.

x: DataType = "classes: Department" выглядит следующим образом.

 public class Department : BindableBase
    {   private string _location;
        public Department(int pdeptNo, string pdeptName, string plocation)
        {
            DeptNo = pdeptNo;
            DeptName = pdeptName;
            Location = plocation;
            ListOfDeparmentEmployees = new List<Employee>();    }

        public int DeptNo { get; set; }
        public string DeptName { get; set; }
        public string Location {
            get { return this._location; }
            set { this.SetProperty(ref this._location, value); }
        }
        public List<Employee> ListOfDeparmentEmployees { get; set; }


    }

1 Ответ

1 голос
/ 04 февраля 2020

Возможно, вы ошиблись положением

В вашем ComboBox вы установите TwoWay на ItemsSource. Это не имеет смысла. Вы не можете изменить Location, если измените значение ComboBox.

Попробуйте это:

Xaml

...
<ComboBox  x:Name="cb1" ItemsSource="{Binding Source={StaticResource MyLocatonList}, Path=ListofLocationsInsideViewModel}" 
           DisplayMemberPath="LocationName" SelectedValuePath="LocationName"  SelectedValue="{x:Bind Location,Mode=TwoWay}"  />
...

Однако, если Вы пишете это напрямую, это приведет к бесконечному l oop, а затем сообщит об ошибке. Вам необходимо переписать свойство Location класса Department.

Department.cs

...
public string Location
{
    get { return this._location; }
    set 
    {
        if (_location != value)
        {
            this.SetProperty(ref this._location, value);
        }
    }
}
...

Кроме того, обратите внимание, является ли ваш BindableBase Базовый класс реализует интерфейс INotifyPropertyChanged, который является основой для изменения пользовательского интерфейса при изменении данных.

С уважением.

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