Можете ли вы иметь несколько привязок на одну кнопку? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь привязать команду и привязку IsVisible к одной кнопке в просмотре списка.Если у меня есть контекст привязки в кнопке, привязка команды будет работать, а привязка IsVisible не будет работать.Если я удалю контекст привязки, привязка IsVisible будет работать, но привязка команды не будет работать.Есть ли какие-либо предложения о том, как исправить эту ситуацию.

<Button BindingContext="{Binding Source={x:Reference icaoDownloads}, 
        Path=BindingContext}"
        Command="{Binding DownloadCommand}"
        CommandParameter="{Binding Source={x:Reference Item}, 
                                          Path=BindingContext}"
        HorizontalOptions="CenterAndExpand"
        VerticalOptions="Center"
        BackgroundColor="Black"
        TextColor="WhiteSmoke"
        Grid.Column="1"
        Text="  Update  "
        BorderColor="DarkSlateGray"
        BorderRadius="5"
        BorderWidth="2"
        Margin="2"
        IsVisible="{Binding IsDownloadable}" />

У меня есть список, созданный из набора базы данных.Я пытаюсь показать кнопку только тогда, когда база данных имеет доступное обновление.Поэтому я хочу, чтобы кнопка отображалась только при наличии обновления, нажмите кнопку и загрузите данные в базу данных, а затем сделайте кнопку невидимой.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Это мое решение:

<Button CommandParameter="{Binding .}"
                                            Command="{Binding BindingContext.DownloadCommand, Source={x:Reference TestIcaoContent}}"
                                            HorizontalOptions="CenterAndExpand"
                                            VerticalOptions="Center"
                                            BackgroundColor="Black"
                                            TextColor="WhiteSmoke"
                                            Grid.Column="1"
                                            Text="  Update  "
                                            BorderColor="DarkSlateGray"
                                            BorderRadius="5"
                                            BorderWidth="2"
                                            Margin="2"
                                            IsVisible="{Binding Source={x:Reference Item}, Path=BindingContext.IsDownloadable}" />

Это решило мою проблему и позволило мне передать значение элемента списка в модель представления.

Это мой конструктор для модели представления:

public ICommand NavCommandCommand { get; private set; }
public INavigation Navigation { get; set; }
public ICommand DownloadCommand { get; private set; }

        public TestIcaoViewModel()
        {

            //DownloadCommand = new Command(Download);
            DownloadCommand = new Command((e) => { var item = (e as TestLandingViewModel); Download(item.IcaoCode); });

            NavCommandCommand = new Command((e) => { var item2 = (e as TestLandingViewModel); NavCommand(item2.IcaoCode); });
            LoadAirportData();   
        }
0 голосов
/ 29 марта 2019

К сожалению, xaml не поддерживает множественные привязки.

Если кнопка в ListView,

BindingContext="{Binding Source={x:Reference icaoDownloads}, Path=BindingContext}"

должен удалить форму Button.

Решение первое : попробуйте следующий код:

<Button
       Command="{Binding BindingContext.DownloadCommand, Source={x:Reference icaoDownloads}}"
        CommandParameter="{Binding Source={x:Reference Item},Path=BindingContext}"
        HorizontalOptions="CenterAndExpand"
        VerticalOptions="Center"
        BackgroundColor="Black"
        TextColor="WhiteSmoke"
        Grid.Column="1"
        Text="  Update  "
        BorderColor="DarkSlateGray"
        BorderRadius="5"
        BorderWidth="2"
        Margin="2"
        IsVisible="{Binding IsDownloadable}" />

Решение второе : если Xaml , то код:

<ListView x:Name="listviewbig" ItemsSource="{Binding Monkeys}" 
                HasUnevenRows="true" 
                ItemTapped="OnListViewItemTapped"
                ItemSelected="OnListViewItemSelected">
  <ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <Grid Padding="10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10" />
                    <ColumnDefinition Width="100" />
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" 
                Grid.Column="0" 
                Text="{Binding Location}"
                VerticalOptions="End" 
                Style="{DynamicResource SubtitleTextStyle}" />
                <Button Grid.Row="0"
                    Grid.Column="1"
                    Text="Click"
                    HorizontalOptions="End"
                    IsVisible="{Binding IsDownloadable}"
                    Clicked="OnClicked"
                    Command="{Binding DownloadCommand}"
                    CommandParameter="2"/>
                <ProgressBar Grid.Row="1" 
                Grid.Column="3" x:Name="progressBar" 
    Progress="{Binding CurrentProgress,Mode=OneWayToSource}" 
    PropertyChanged="ProgressBar_PropertyChanged"/>
            </Grid>
        </ViewCell>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

MonkeysViewModel.cs

    class MonkeysViewModel
    {
        public IList<Monkey> Monkeys { get; private set; }

        private async void ShowCustomerInfo(object obj)
        {
             Console.WriteLine("true" + obj );
        }

        public MonkeysViewModel()
            {


                Monkeys = new List<Monkey>();
                //f = new F[5];
                Monkeys.Add(new Monkey
                {
                    Name = "Baboon",
                    Location = "Africa & Asia",
                    CommandShowInfo = new Command(ShowCustomerInfo),
                    IsDownloadable = true
                });
                ...
                }
            }
    }

Monkey.cs

public class Monkey : INotifyPropertyChanged
{
    public string Name { set; get; }
    public string Location { get; set; }

    public System.Windows.Input.ICommand CommandShowInfo { get; set; }

    private bool isDownloadable = true;
    public bool IsDownloadable
    {
        set
        {
            if (isDownloadable != value)
            {
                isDownloadable = value;
                OnPropertyChanged("IsDownloadable");
            }
        }
        get
        {
            return isDownloadable;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Здесь ListView ContentPage: BindingContext = new MonkeysViewModel();

и метод тестирования в кнопке:

void OnClicked(Object sender, MyEventArgs args)
{
    Button btn = sender as Button;
    var monkey = btn.BindingContext as Monkey;
    monkey.IsDownloadable = false;
}

Возможно, проблема связана с привязкой. Неправильно используется модель.

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