XAML 在 UWP 中绑定一个 List<> 项
XAML binding one List<> item in UWP
我在绑定列表<>中的一项时遇到问题。
我已经从 JSON 文件中导入了数据,我想遍历其中的数组并将其显示在文本框中。
数据如下所示:
{name: "ABC", Items: [ {str: "aaa"}, {str: "bbb"}, {str: "ccc"} ]}
这里有一个 C# 的例子:
public class A
{
public string Str { get; set; }
}
public class ParentA
{
public string Name { get; set; }
public List<A> Items { get; set; }
}
public class MyPage : Page
{
public ParentA ObjectParrentA { get; set; }
public int SelectedItem { get; set; }
public MyPage ()
{
ObjectParrentA = new ParentA();
// here is binding of ObjectParrentA by JSON data.
SelectedItem = 0;
this.DataContext = this;
this.InitializeComponent();
}
private void NextItem_Click(object sender, RoutedEventArgs e)
{
SelectedItem++;
}
}
和XAML:
<TextBlock Text="{Binding ObjectParrentA.Items[SelectedItem].Str}" />
<Button Name="NextItem" Click="NextItem_Click" Content="Next Item" />
在文本框的开头应该显示 "aaa",单击下一个项目按钮后应该显示 "bbb",等等...
现在 TextBlock 是空白的。我觉得肯定是"Binding ObjectParrentA.Items[SelectedItem].Str"有问题,但是我没有太多的绑定经验
你有什么提示,如何实现这个?谢谢。
我稍微更改了一下,使其更像 MVVM。您需要将其重构为一个页面:
public class A
{
public string Str { get; set; }
}
public class ParentAViewModel : INotifyPropertyChanged
{
private int _currentIndex;
public ParentAViewModel()
{
Items = new List<A>();
}
public string Name { get; set; }
public List<A> Items { get; set; }
public int CurrentIndex
{
get
{
return _currentIndex;
}
set
{
_currentIndex = value;
OnPropertyChanged();
OnPropertyChanged(nameof(CurrentItem));
}
}
public string CurrentItem => Items[CurrentIndex].Str;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class MainWindow : Window
{
public ParentAViewModel ObjectParrentA { get; set; }
public int SelectedItem { get; set; }
public MainWindow()
{
ObjectParrentA = new ParentAViewModel();
ObjectParrentA.Items.Add(new A() { Str = "1" });
ObjectParrentA.Items.Add(new A() { Str = "2" });
ObjectParrentA.Items.Add(new A() { Str = "3" });
// here is binding of ObjectParrentA by JSON data.
SelectedItem = 0;
this.DataContext = this;
InitializeComponent();
}
private void NextItem_Click(object sender, RoutedEventArgs e)
{
ObjectParrentA.CurrentIndex++;
}
}
XAML:
<StackPanel>
<TextBlock Text="{Binding ObjectParrentA.CurrentItem}" />
<Button Name="NextItem" Click="NextItem_Click" Content="Next Item" />
</StackPanel>
当您绑定到可观察的属性时,WPF 会发挥最佳作用 - 方法可能很棘手。添加一个 ViewModel 来促进这一点很常见,因此您不会用仅与视图相关的对象污染您的模型 类。
在这里,我们正在通过绑定查看 属性 CurrentItem。单击按钮时,我们通过 CurrentIndex setter 的 OnPropertyChanged(nameof(CurrentItem)) 通知 WPF CurrentItem 已更改,然后将视图重新绑定到新值。
我希望这是有道理的。祝你好运。
我在绑定列表<>中的一项时遇到问题。
我已经从 JSON 文件中导入了数据,我想遍历其中的数组并将其显示在文本框中。
数据如下所示:
{name: "ABC", Items: [ {str: "aaa"}, {str: "bbb"}, {str: "ccc"} ]}
这里有一个 C# 的例子:
public class A
{
public string Str { get; set; }
}
public class ParentA
{
public string Name { get; set; }
public List<A> Items { get; set; }
}
public class MyPage : Page
{
public ParentA ObjectParrentA { get; set; }
public int SelectedItem { get; set; }
public MyPage ()
{
ObjectParrentA = new ParentA();
// here is binding of ObjectParrentA by JSON data.
SelectedItem = 0;
this.DataContext = this;
this.InitializeComponent();
}
private void NextItem_Click(object sender, RoutedEventArgs e)
{
SelectedItem++;
}
}
和XAML:
<TextBlock Text="{Binding ObjectParrentA.Items[SelectedItem].Str}" />
<Button Name="NextItem" Click="NextItem_Click" Content="Next Item" />
在文本框的开头应该显示 "aaa",单击下一个项目按钮后应该显示 "bbb",等等...
现在 TextBlock 是空白的。我觉得肯定是"Binding ObjectParrentA.Items[SelectedItem].Str"有问题,但是我没有太多的绑定经验
你有什么提示,如何实现这个?谢谢。
我稍微更改了一下,使其更像 MVVM。您需要将其重构为一个页面:
public class A
{
public string Str { get; set; }
}
public class ParentAViewModel : INotifyPropertyChanged
{
private int _currentIndex;
public ParentAViewModel()
{
Items = new List<A>();
}
public string Name { get; set; }
public List<A> Items { get; set; }
public int CurrentIndex
{
get
{
return _currentIndex;
}
set
{
_currentIndex = value;
OnPropertyChanged();
OnPropertyChanged(nameof(CurrentItem));
}
}
public string CurrentItem => Items[CurrentIndex].Str;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class MainWindow : Window
{
public ParentAViewModel ObjectParrentA { get; set; }
public int SelectedItem { get; set; }
public MainWindow()
{
ObjectParrentA = new ParentAViewModel();
ObjectParrentA.Items.Add(new A() { Str = "1" });
ObjectParrentA.Items.Add(new A() { Str = "2" });
ObjectParrentA.Items.Add(new A() { Str = "3" });
// here is binding of ObjectParrentA by JSON data.
SelectedItem = 0;
this.DataContext = this;
InitializeComponent();
}
private void NextItem_Click(object sender, RoutedEventArgs e)
{
ObjectParrentA.CurrentIndex++;
}
}
XAML:
<StackPanel>
<TextBlock Text="{Binding ObjectParrentA.CurrentItem}" />
<Button Name="NextItem" Click="NextItem_Click" Content="Next Item" />
</StackPanel>
当您绑定到可观察的属性时,WPF 会发挥最佳作用 - 方法可能很棘手。添加一个 ViewModel 来促进这一点很常见,因此您不会用仅与视图相关的对象污染您的模型 类。
在这里,我们正在通过绑定查看 属性 CurrentItem。单击按钮时,我们通过 CurrentIndex setter 的 OnPropertyChanged(nameof(CurrentItem)) 通知 WPF CurrentItem 已更改,然后将视图重新绑定到新值。
我希望这是有道理的。祝你好运。