【问题标题】:How to set different Binding to each Array element? C# UWP如何为每个 Array 元素设置不同的 Binding? C# UWP
【发布时间】:2016-06-09 10:36:49
【问题描述】:

我设法在 TextBlock 中显示我的数组 - 每个 [element] 在单独的行中,但我想将每个 Array[index] 元素放入同一行中的单独 TextBlock 中,只要它来自同一行,所以:

  1. 文件被访问
  2. 行已排序
  3. 行被分割成单词
  4. 每一行放在单独的行上

5.行中的每个单词都被放入单独的 TextBlock 但在同一行内。

这是我的代码:

public async void ReadFile()
    {
        var path = @"CPU.xls";
        var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

        var file = await folder.GetFileAsync(path);
        var readFile = await Windows.Storage.FileIO.ReadLinesAsync(file);
        foreach (string line in readFile.OrderBy(line =>
        {
            int lineNo;
            var success = int.TryParse(line.Split(';')[4], out lineNo);
            if (success) return lineNo;
            return int.MaxValue;
        }))
        {
            string[] splitLines = line.Split(';');

            for (int index = 0; index < splitLines.Length; index++)
            {
                itemsControl.Items.Add(splitLines[index]);
            }               
        }      
    }

正如您在上面看到的,我已经完成了步骤 1 到 4,不幸的是,此时每个单词都进入了不同的行。

这是我的 xaml 文件的较大部分:

<ItemsControl x:Name="itemsControl"
              ItemsSource="{Binding itemsControl}"
              FontSize="24">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid Width="Auto"
                          Margin="0 12"
                                   HorizontalAlignment="Center">
                                <Grid.ColumnDefinitions>                                       
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />                                        
                                </Grid.RowDefinitions>                                    
                                 <StackPanel Grid.Column="0"
                                    Grid.Row="0"
                                    Orientation="Horizontal">
                                    <TextBlock Text="{Binding }" />
                                </StackPanel>
                                <StackPanel Grid.Column="1"
                                    Grid.Row="0"
                                    Orientation="Horizontal">
                                    <TextBlock Text="{Binding }" />
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

我现在放了两个 TextBlocks 而不是 5 个。如何让它们各自获得不同的绑定路径来链接不同的数组元素?

---------更新---------- 我编辑了 TextBlocks,所以它们每个都指向不同的数组元素,如下所示:

<StackPanel Grid.Column="0"
            Grid.Row="0"
            Orientation="Horizontal">
          <TextBlock Text="{Binding Path=splitLines[0]}" />
</StackPanel>
<StackPanel Grid.Column="1"
            Grid.Row="0"
            Orientation="Horizontal">
          <TextBlock Text="{Binding Path=splitLines[1]}" />
</StackPanel>

此时我没有收到任何错误,但遗憾的是根本没有显示任何数据。为什么绑定到数组元素不起作用?

【问题讨论】:

  • 在这种情况下,最好将此逻辑构建到视图模型中,并公开List&lt;string[]&gt;(或List&lt;YourClass&gt;)的属性。然后,您可以将该属性设置为 ItemsControlItemsSource,并根据需要将列绑定到字段。
  • 请您提供一些代码好吗?

标签: c# xaml binding split uwp


【解决方案1】:

您可以很容易地设置ItemsPanel of ItemsControl

编辑ItemTemplate 添加到ItemsControl

假设你有一个MainPage.xaml

<ItemsControl x:Name="WordsList"
              ItemsSource="{Binding listOfWords}">
    <!-- Ensures each item is displayed horizontally -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"></StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!--if you want each line in seperate TextBlock with more control-->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
               <TextBlock Text="{Binding}" FontSize="22" />
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

MainPage.xaml.cs后面的代码中

public sealed partial class MainPage : Page
{
    //Your intial string
    string words = "I am Line 1; I am Line 2; I am Line 3";

    //Using an ObservableCollection as works well with data binding
    public ObservableCollection<string> listOfWords { get; set; } = 
        new ObservableCollection<string>();

    public MainPage()
    {
        this.InitializeComponent();

        //set the DataContext to this page
        this.DataContext = this;

        Loaded += (s, args) =>
        {
            var splitWords = words.Split(';');
            foreach(var word in splitWords)
            {
                //each line is added to listOfWords and can then be accessed by the ItemsControl as the ItemsSource
                //is set to listOfWords
                listOfWords.Add(word);
            }                
        };
    }
}

EDIT2 要绑定到数组,您需要一个公共属性,例如

public string[] splitLines { get; set; }

【讨论】:

  • 我到此为止,但是当我想将每一行中的每个单词放入单独的列时,问题就出现了。
  • 我不明白如果你想按单词分割,那么你需要改变你的标准来分割空间。
  • 我的 C# 代码已经为我提供了每一行的每个单词,但我无法绑定到 array[index]
  • 我今天将尝试您的解决方案,并会更新发生的情况
  • 我不知道如何解决它。我试过你的建议,但想不出方法来实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2020-10-17
相关资源
最近更新 更多