gpt4 book ai didi

wpf - 数据绑定(bind)到 WrapPanel 不能按预期工作

转载 作者:行者123 更新时间:2023-12-03 10:20:52 25 4
gpt4 key购买 nike

我正在尝试填充 WrapPanel带有我自己的用户控件的集合。

child 控制:

<UserControl x:Class="MyApplication.StockMappings.StockView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Width="140" Height="80">
<Border CornerRadius="6" BorderBrush="Black" BorderThickness="2" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.6*"/>
<RowDefinition Height="0.4*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" FontSize="18" FontWeight="Bold">
<Label Content="{Binding Path=ID}"/>
</TextBlock>
<TextBlock Grid.Row="1" FontSize="12" FontWeight="Bold">
<Label Content="{Binding Path=StockName}"/>
</TextBlock>
</Grid>
</Border>
</Grid>
</UserControl>

cs 文件:
namespace MyApplication.StockMappings
{
/// <summary>
/// Interaction logic for StockView.xaml
/// </summary>
public partial class StockView : UserControl
{
public StockView()
{
InitializeComponent();
}

public string ID
{
get;
set;
}

public string StockName
{
get;
set;
}
}
}

最后,带有环绕面板的窗口:
<Window x:Class="MyApplication.StockMappings.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyApplication.StockMappings"
Title="TestWindow" Height="300" Width="300">
<Grid>
<ItemsControl Name="Stocks" ItemsSource="{Binding AllStocks}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:StockView/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>

又是 C# 代码:
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
var stocks = new[]
{
new StockView() { ID = "M0", StockName = "abc"},
new StockView() { ID = "M1", StockName = "def"},
};

Stocks.DataContext = new Test()
{
AllStocks = stocks.ToList()
};
}
}
Test类(子数据的容器)非常简单:
public class Test
{
public List<StockView> AllStocks
{
get;
set;
}
}

最后,结果:

screenshot

所有边框都是空白的。都不是 ID也不是 StockName被显示。

我究竟做错了什么?

我已经确认(通过添加一个虚拟属性) StockView控制采取 ID来自 Test 的值对象,而不是来自 AllStocks 的 child 列表。但为什么?我没有定义 ItemTemplate ?那它是为了什么?

最佳答案

您缺少的是保存数据的适当 View 模型项类。这不应该与 View 对象混淆,例如您的 StockView。

首先,删除 IDStockName StockView 控件的属性。这些属性将移至数据项类。

public partial class StockView : UserControl
{
public StockView()
{
InitializeComponent();
}
}

其次,使用 StockItem 创建 View 模型数据项类和 ViewModel具有 AllStocks 的类属性(或者像你已经做过的那样直接称它为 Test)。
public class StockItem
{
public string ID { get; set; }
public string StockName { get; set; }
}

public class ViewModel
{
public ObservableCollection<StockItem> AllStocks { get; set; }
}

最后,将 MainWindow 的 DataContext 设置为 ViewModel 类的实例。
public MainWindow()
{
InitializeComponent();

var vm = new ViewModel { AllStocks = new ObservableCollection<StockItem>() };
vm.AllStocks.Add(new StockItem { ID = "M0", StockName = "abc" });
vm.AllStocks.Add(new StockItem { ID = "M1", StockName = "def" });

DataContext = vm;
}

如果添加到 AllStocks 后可以修改数据项收藏, StockItem类必须实现 INotifyPropertyChanged 界面。

关于wpf - 数据绑定(bind)到 WrapPanel 不能按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16281529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com