1

这就是我想要做的:我有一个List<myCustomType>. 现在我想在画布(或任何其他容器)上显示该列表。来自(几个字符串、一个图像、一个字符串列表)的每个属性myCustomType都有一个设计好的控制画布。基本上,我想将画布上的每个控件绑定到myCustomType. 然后我想在画布上有按钮,让我可以循环浏览List<myCustomType>并同时更新所有控件,以便所有控件始终显示单个列表项的内容。

我一直在环顾四周,但找不到任何可以用作起点的东西。

这很容易实现吗?还是我必须从头开始编写代码?

4

2 回答 2

4

这是一个使用 MVVM 的示例。

我的客户模型非常简单,如下所示:

public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

接下来,我们需要一个 ViewModel,应用程序的 MainWindow 将绑定到该 ViewModel。它拥有客户,并具有通过按钮在客户之间移动的方法。CollectionView 类型支持当前项目跟踪,我想类似于 WinForms 的 BindingSource:

public class MyViewModel
{
    public ICollectionView Customers { get; set; }

    public void MoveSelectionLeft()
    {
        Customers.MoveCurrentToPrevious();
    }

    public void MoveSelectionRight()
    {
        Customers.MoveCurrentToNext();
    }

    public MyViewModel()
    {
        Customers = new CollectionViewSource
            {
                Source = new[]
                    {
                        new Customer {Name = "John", Age = 25},
                        new Customer {Name = "Jane", Age = 27},
                        new Customer {Name = "Dawn", Age = 31}
                    }
            }.View;
    }
}

接下来我们有视图。我正在使用 Caliburn Micro 来简化将操作连接到按钮的过程。只需下载它并将对 Caliburn.Micro.dll 的引用添加到您的项目中:

<Window x:Class="WpfApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cal="http://www.caliburnproject.org" Title="MainWindow" Height="400" Width="400">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <ListBox Grid.RowSpan="2" ItemsSource="{Binding Customers}" DisplayMemberPath="Name"/>

    <DockPanel Grid.Column="1" LastChildFill="False">
        <Button DockPanel.Dock="Left" Content="&lt;"
                    cal:Message.Attach="[Event Click] = [MoveSelectionLeft]"/>
        <Button DockPanel.Dock="Right" Content="&gt;"
                    cal:Message.Attach="[Event Click] = [MoveSelectionRight]"/>
    </DockPanel>

    <StackPanel Grid.Row="1" Grid.Column="1">
        <DockPanel>
            <TextBlock MinWidth="50" Text="Name" Margin="0,0,5,0"/>
            <TextBox Text="{Binding Customers/Name}"/>
        </DockPanel>
        <DockPanel>
            <TextBlock MinWidth="50" Text="Age" Margin="0,0,5,0"/>
            <TextBox Text="{Binding Customers/Age}"/>
        </DockPanel>
    </StackPanel>
</Grid>

我们有一个绑定到 MyViewModel 的 Customers 属性的 ListBox,其 Click 事件已附加到 MoveSelection 方法的按钮,并且 Customer 字段绑定到 Customers/ 属性,该属性是 Customers.CurrentItem 的缩写。

假设这是 WPF 应用程序的主窗口,我们接下来需要做的就是将其 DataContext 设置为 MyViewModel。这可以通过在代码隐藏的构造函数中添加以下内容来完成:

public MainWindow()
{
    this.DataContext = new MyViewModel();

    InitializeComponent();
}

现在应该设置所有内容,以便您可以构建和运行应用程序。它看起来像这样:

截屏

于 2012-10-13T10:03:25.097 回答
0

我不是 WPF 专家,但我认为如果不在类后面的代码中编码,这是不可能的。最简单的方法是创建一个包含当前列表项并绑定到控件的属性。使用事件处理程序或命令,如果您使用 MVVM,则可以将列表项设置为下一个或上一个。

对于绑定问题,我非常推荐 wpf 绑定备忘单: http ://www.nbdtech.com/Free/WpfBinding.pdf

于 2012-10-13T07:34:56.167 回答