Xamarin Binding Grid ColumnDefinition - обновление ширины из viewModel - PullRequest
0 голосов
/ 10 марта 2020

У меня есть хак, чтобы показать изображение, движущееся с индикатором выполнения. Работает отлично, кроме обновления. Индикатор выполнения обновляется, но ширина столбца не определяется.

, т.е. если прогресс равен 50%, тогда я делаю пустой столбец 1 шириной 50%, а столбец 2 - это изображение. Работает на нагрузке, работает на ручном refre sh, но на таймере перемещается только индикатор выполнения. В общем списке потенциально может быть несколько элементов с одинаковой идеей индикатора выполнения, но разными значениями.

<Grid VerticalOptions="CenterAndExpand" Margin="0, -20, -20, -20" ColumnSpacing="-10" RowSpacing="0" Padding="0" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding progressPrecent}"/>
        <ColumnDefinition Width="{Binding progressPercentRemainder}"/>
    </Grid.ColumnDefinitions>
    <Grid.Triggers>
        <DataTrigger TargetType="Grid" Binding="{Binding progress}" Value="0">
            <Setter Property="IsVisible" Value="False"/>
        </DataTrigger>
    </Grid.Triggers>
    <Label Grid.Column="0"/>
    <Image Grid.Column="1" HorizontalOptions="StartAndExpand" Scale=".7" Source="bus.png"/>
</Grid>
<ProgressBar x:Name="pb_TodayRun" Margin="0,0" Progress="{Binding progress}" ProgressColor="{StaticResource Teal}">
    <ProgressBar.Triggers>
        <DataTrigger TargetType="ProgressBar" Binding="{Binding progress}" Value="0">
            <Setter Property="IsVisible" Value="False"/>
        </DataTrigger>
    </ProgressBar.Triggers>
</ProgressBar>

Код позади:

protected override void OnAppearing()
{
    base.OnAppearing();
    isShown = true;

    Device.StartTimer(TimeSpan.FromSeconds(60/*viewModel.AutoRefreshTime*/), () =>
    {
        if (isShown)
        {
            UpdateProgress(false);
            ForceLayout();
            return true;
        }
        else
            return false;
    });
}

view Модель:

public ObservableCollection<TodayCell> Items { get; set; }
...
public async Task<List<TodayCell>> UpdateProgress(bool allowCached)
   {
    List<TodayCell.Run> temp = new List<TodayCell.Run>();
        ....
                            temp.Add(new TodayCell.Run()
                            {
                                progress = progress,
                                progressPrecent = new GridLength(progressPercent, GridUnitType.Star),
                                progressPercentRemainder = new GridLength((100-progressPercent), GridUnitType.Star),
                            });

Он загружается нормально, каждую минуту движется индикатор выполнения, а ширина изображения / столбца - нет, хотя отладчик показывает, что число увеличивается.

Как я могу сделать это правильно?

Edit, вот где обновляются элементы:

for (int x=0; x<=Items.Count();x++)
{
  if (Items[x] is TodayCell.Run)
  {
    var run = (TodayCell.Run)Items[x];
    var updatedRun = list.FirstOrDefault(u => u.StudentStopId == run.StudentStopId);
    if (updatedRun == null)
       Items.Remove(Items[x]);
    else
       Items[x] = updatedRun;
  }
}

EDIT2: Это работает, если я использую другой подход / переменную. Измените ширину столбца на auto, затем, если я установлю пустую метку WidthRequest 1-го столбца в пикселях (переведите% с помощью Application.Current.MainPage.Width), это обновит и переместит изображение вдоль индикатора выполнения. Ширина столбца не будет обновляться, но метка widthRequest будет обновляться.

1 Ответ

0 голосов
/ 11 марта 2020

Для того, чтобы это было помечено как завершенное, я нашел альтернативный маршрут, который достиг такого же результата для меня.

Ширина определения столбца сетки формы Xamarin не будет отображать никаких изменений ... но установив его на Авто, и затем использование пустой метки widthRequest внутри прекрасно работает. Так что я просто должен был выяснить, как превратить% в пиксели, что делает тот же самый%, умноженный на ширину телефона (с небольшим буфером)

Модифицированный код ниже

<Grid VerticalOptions="CenterAndExpand" Margin="0, -20, -20, -20" ColumnSpacing="-10" RowSpacing="0" Padding="0" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="Auto"/>
  </Grid.ColumnDefinitions>
  <Grid.Triggers>
    <DataTrigger TargetType="Grid" Binding="{Binding progress}" Value="0">
      <Setter Property="IsVisible" Value="False"/>
    </DataTrigger>
  </Grid.Triggers>
  <Label Grid.Column="0" WidthRequest="{Binding busProgressPixels}"/>
  <Image Grid.Column="1" HorizontalOptions="StartAndExpand" Scale=".7" Source="bus.png"/>
</Grid>

И в viewModel

double progressPixels = ((progress * Application.Current.MainPage.Width))-((progress*.20)* Application.Current.MainPage.Width);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...