在UWP中绑定(c#)

时间:2016-10-10 12:06:25

标签: c# binding uwp

我有listview with binding:

 <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>

但是有什么表现。

我的麻烦在哪里?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你的问题不是很清楚,所以我只能猜测你想要达到的目标。看起来您需要某种master-detail界面,其中您从列表中选择一个项目(主),然后另一个表单显示控件,用于编辑该项目的数据(详细信息)。

你的第一个ListView看起来很好(并且绑定可以正常工作)。但是为什么要使用另一个ListView来显示所选项目的详细信息? ListView用于显示数据列表,但看起来RootObject不是数组或集合类(我可能错了,我不知道类定义)。您可能不应该使用ListView,但无论您使用什么,都应该将AllRoundsSelectedItem绑定到面板的DataSource属性。

答案 1 :(得分:0)

解决方案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:如果您仍想使用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的类型应为ListOberservableCollection,这意味着您需要修改后面的代码,例如:

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的数据类型。