繁体   English   中英

在UWP中绑定(C#)

[英]Binding in UWP (c#)

我有绑定的列表视图:

 <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();} 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>

但是什么都显示。

我的麻烦在哪里?

非常感谢您的帮助!

您的问题不是很清楚,所以我只能猜测您要达到的目标。 似乎您需要某种主从界面,在该界面中,您从列表中选择一个项目(主),然后显示另一个带有控件的表格,用于编辑该项目的数据(细节)。

您的第一个ListView看起来不错(绑定如您所说的那样有效)。 但是,为什么要使用另一个ListView来显示所选项目的详细信息? ListView用于显示数据列表,但是RootObject似乎不是数组或集合类(我可能错了,我不知道类定义)。 您可能不应该使用ListView,但是无论使用什么,都应将AllRoundsSelectedItem绑定到面板的DataSource属性。

解决方案1:我基本上同意@Decade Moon,但是对于最后一行,您使用的StackPanel没有DataSource属性,我认为这可能是一个错字,应该是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的数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM