Привязка в UWP (c #)

#c# #binding #uwp

#c# #привязка #uwp

Вопрос:

У меня есть listview с привязкой:

  <ListView   x:Name="OrdersListView" IsItemClickEnabled="True" SelectionMode="Single" 
                    ItemClick="OrdersListView_ItemClick"  SelectedItem="{Binding AllRoundsSelectedItem, Mode=TwoWay}">
  

Мне нужно щелкнуть элемент и получить данные.

Я делаю это так.

     public RootObject allRoundsSelectedItem;
    public RootObject AllRoundsSelectedItem
    {
        get { return allRoundsSelectedItem; }
        set { allRoundsSelectedItem = value; OnPropertyChanged();}
    }


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


    private void OrdersListView_ItemClick(object sender, ItemClickEventArgs e)
    {

    }
  

Когда я устанавливаю точку останова в этой строке set { allRoundsSelectedItem = value; OnPropertyChanged();}

Я вижу, что у меня есть значение, которое мне нужно иметь.

Я пытаюсь ввести данные в другой ListView.

Вот код для этого:

  <ScrollViewer HorizontalAlignment="Left" Height="667" Margin="415,54,-124,-1" VerticalAlignment="Top" Width="989">
        <ListView   x:Name="DetailsListView" ItemsSource="{Binding AllRoundsSelectedItem}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Height="667" Width="989">
            <Grid x:Name="DetailGrid"  Height="667" Width="989"  VerticalAlignment="Top" >
                <Grid HorizontalAlignment="Left" Height="44" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock1" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Время и дата заказа" VerticalAlignment="Top" Height="44" Width="214" FontSize="23"/>
                                <TextBlock x:Name="textBlock2" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding date_created}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,44,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock3" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Статус" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                                <TextBlock x:Name="textBlock4" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding status }" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,88,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock5" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Осталось времени" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock6" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,132,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock7" HorizontalAlignment="Left" TextWrapping="Wrap" Text="На когда" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock8" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding billing.city}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,176,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock9" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Сумма" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock10" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding total}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,220,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock11" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Имя" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock12" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding billing.first_name}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,264,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock13" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Телефон" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock14" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding billing.phone}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,308,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock15" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Адрес" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock16" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding billing.address_1}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,352,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock17" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Количество персон" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock18" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="{Binding billing.postcode}" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,396,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock19" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Откуда" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock20" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,440,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock21" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Состав заказа" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock22" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,484,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock23" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Приметка для кухни" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock24" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
                <Grid HorizontalAlignment="Left" Height="44" Margin="0,528,0,0" VerticalAlignment="Top" Width="989" BorderBrush="#FFFBF8F8" BorderThickness="0,0,1,1">
                    <TextBlock x:Name="textBlock25" HorizontalAlignment="Left" TextWrapping="Wrap" Text="Приметка для курьера" VerticalAlignment="Top" Height="44" Width="360" FontSize="23"/>
                    <TextBlock x:Name="textBlock26" HorizontalAlignment="Left" Margin="500,0,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="44" Width="360"/>
                </Grid>
            </Grid>
        </StackPanel></DataTemplate></ListView.ItemTemplate></ListView>
  

Но что-нибудь показывает.

В чем моя проблема?

Большое спасибо за помощь!

Комментарии:

1. Я думаю, я не совсем понимаю ваш вопрос, но чтобы получить данные из представления, щелкнув по ним, вы можете использовать Command .

2. Вы проверили мой ответ? есть проблемы?

Ответ №1:

Ваш вопрос был не очень ясен, поэтому я могу только догадываться о том, чего вы пытались достичь. Похоже, что вам нужен какой-то интерфейс master-detail, в котором вы выбираете элемент из списка (master), а затем отображается другая форма с элементами управления для редактирования данных для этого элемента (detail).

Ваш первый ListView выглядит нормально (и привязка работает, как вы сказали). Но почему вы используете другой ListView для отображения сведений о выбранном элементе? ListViews предназначены для отображения списков данных, но, похоже, RootObject не является классом массива или коллекции (я могу ошибаться, я не знаю определения класса). Вероятно, вам не следует использовать ListView, но что бы вы ни использовали, вы должны привязать AllRoundsSelectedItem его к DataSource свойству панели.

Комментарии:

1. Может быть, вы говорите о ItemsSource?

Ответ №2:

Решение 1: я в основном согласен с @Decade Moon, но для последней строки нет DataSource свойства StackPanel , которое вы использовали, я думаю, что это, возможно, опечатка, так и должно быть DataContext . В любом случае, здесь я пишу этот ответ, чтобы дать демонстрацию для этого решения:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <ListView x:Name="OrdersListView" IsItemClickEnabled="True" SelectionMode="Single"
                ItemClick="OrdersListView_ItemClick"  SelectedItem="{Binding AllRoundsSelectedItem, Mode=TwoWay}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ItemName}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <ScrollViewer Grid.Column="1">
        <StackPanel x:Name="Detail" Grid.Column="1" >
            <TextBlock Text="{Binding ItemName}" FontSize="30" Foreground="Red" />
            <TextBlock Text="{Binding Paramether1}" Margin="0,15" FontSize="20" />
            <TextBlock Text="{Binding Paramether2}" FontSize="20" />
            <TextBlock Text="{Binding Paramether3}" Margin="0,15" FontSize="20" />
            <TextBlock Text="{Binding Paramether4}" FontSize="20" />
            <TextBlock Text="{Binding Paramether5}" Margin="0,15" FontSize="20" />
        </StackPanel>
    </ScrollViewer>
</Grid>
  

Если ваш макет похож на этот, то вы можете сохранить большую часть кода позади и в коде OrdersListView_ItemClick события следующим образом:

 private void OrdersListView_ItemClick(object sender, ItemClickEventArgs e)
{
    AllRoundsSelectedItem = e.ClickedItem as RootObject;
    Detail.DataContext = AllRoundsSelectedItem;
}
  

Решение 2. если вы все еще хотите использовать a ListView для отображения деталей, чтобы их можно было выбрать или что-то еще, вы можете, например, написать такой код:

 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <ListView x:Name="OrdersListView" IsItemClickEnabled="True" SelectionMode="Single"
                ItemClick="OrdersListView_ItemClick"  SelectedItem="{Binding AllRoundsSelectedItem, Mode=TwoWay}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding ItemName}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <ListView x:Name="DetailsListView" ItemsSource="{Binding AllRoundsSelectedItem}" Grid.Column="1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding}" FontSize="20" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
  

И тип AllRoundsSelectedItem должен быть List или OberservableCollection , это означает, что вам нужно изменить свой код, например, так:

 public sealed partial class MainPage : Page, INotifyPropertyChanged
{
    public MainPage ()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }

    private ObservableCollection<RootObject> collection = new ObservableCollection<RootObject>();

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        for (int i = 0; i < 100; i  )
        {
            collection.Add(new RootObject
            {
                ItemName = "Item "   i,
                Paramether1 = "Paramether1 "   i,
                Paramether2 = "Paramether2 "   i,
                Paramether3 = "Paramether3 "   i,
                Paramether4 = "Paramether4 "   i,
                Paramether5 = "Paramether5 "   i,
            });
        }
        OrdersListView.ItemsSource = collection;
    }

    public ObservableCollection<string> allRoundsSelectedItem;

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<string> AllRoundsSelectedItem
    {
        get { return allRoundsSelectedItem; }
        set
        {
            allRoundsSelectedItem = value;
            OnPropertyChanged();
        }
    }

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

    private void OrdersListView_ItemClick(object sender, ItemClickEventArgs e)
    {
        var item = e.ClickedItem as RootObject;
        AllRoundsSelectedItem = new ObservableCollection<string>
        {
            item.ItemName,item.Paramether1,
            item.Paramether2, item.Paramether3,
            item.Paramether4, item.Paramether5,
        };
    }
}
  

На моей стороне RootObject класс выглядит так:

 public class RootObject
{
    public string ItemName { get; set; }
    public string Paramether1 { get; set; }
    public string Paramether2 { get; set; }
    public string Paramether3 { get; set; }
    public string Paramether4 { get; set; }
    public string Paramether5 { get; set; }
}
  

Возможно, есть и другие решения, но вам нужно будет либо изменить свой код xaml, либо тип ваших данных AllRoundsSelectedItem .