繁体   English   中英

C# WPF 通过 XAML 动态创建和绑定组合框

[英]C# WPF dynamically creating and binding comboboxes via XAML

我对 WPF 和 MVVM 还很陌生,现在我遇到了一个问题,到目前为止我还没有找到解决方案。 我正在更新一个使用 Windows.Forms 的旧程序。 由于我目前正在阅读和学习 WPF,我认为重做 WPF 中的程序是个好主意。

我的程序以特殊格式读取一个 ASCII 文件,并从中创建一个Fragment对象列表。 然后列表显示在动态创建的 GUI 中。 Fragment object 如下所示:

public class Fragment
{
    public string Name { get; set; }

    public List<Value> Values { get; set; }

    public int ActiveIndex { get; set; }
}

public class Value
{
    public string Name { get; set; }

    public int BitValue { get; set; }
}

所以:每个Fragment在属性中可以有多个Value对象。 活动值也从 ASCII 文件中读取,其索引(来自List<Value>中的值的索引)保存在ActiveIndex属性中。

我准备了一个简单的 XAML 布局,其中将显示结果。

<ScrollViewer VerticalScrollBarVisibility="Auto">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel Margin="0, 3"></StackPanel>
        <GridSplitter Grid.Column="1" ResizeDirection="Columns" Background="DarkGray" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" IsEnabled="True" Width="1"></GridSplitter>
        <StackPanel Grid.Column="2" Margin="0, 3"></StackPanel>
    </Grid>
</ScrollViewer>

所以:在第一个 StackPanel 中,我想将所有Fragment.Name显示为标签,在第二个 StackPanel 中,我想为每个带有显示Value.Name属性的FragmentFragment.Values创建一个 ComboBox。 ActiveIndex绑定到 combobox 的 SelectedIndex。

我可以在文件后面的代码中完美地做到这一点,但这会让我和其他看到这一点的人非常头疼。 我知道,可以在 XAML 中做到这一点,但我真的不明白它是如何完成的。 谁能向我暗示正确的方向,谁能实现这种行为? 此外,如果有更好的 GUI 方法来处理它,我完全愿意接受建议。 当前的一个只是从工具的 Windows.Forms 版本的简单转移。

您可以使用 ItemsControl:

<ScrollViewer VerticalScrollBarVisibility="Auto">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ItemsControl ItemsSource="{Binding NameOfYourListOfFragments}">
            <ItemsControl.ItemsPanel>
                <StackPanel Margin="0, 3"></StackPanel>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <Label Content="{Binding Name}"/>
            </itemsControl.ItemsTemplate>
        </ItemsControl>

        <GridSplitter Grid.Column="1" ResizeDirection="Columns" Background="DarkGray" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" IsEnabled="True" Width="1"></GridSplitter>
        <ItemsControl Grid.Column="2" ItemsSource="{Binding NameOfYourListOfFragments}">
            <ItemsControl.ItemsPanel>
                <StackPanel  Margin="0, 3"></StackPanel>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemsTemplate>
                <Combobox ItemsSource="{Binding Values}" DisplayMemberPath="Name" SelectedIndex="{Binding ActiveIndex}"/>
            </ItemsControl.ItemsTemplate>
        </ItemsControl>
    </Grid>
</ScrollViewer>

使用ItemsPanel ,您可以告诉ItemsControl ,您的 GUI 元素应该安排在哪种面板中。 ItemTemplate告诉您,您的 ItemsControl 中的元素是什么样的。

如果您使用ObservableCollection ,您还可以在运行时添加或删除条目,并且 GUI 将自动更新。

为了使绑定充分发挥作用,您的类可能还必须执行INotifyPropertyChanged元素,并且您必须在属性的设置器中调用PropertyChanged事件。

暂无
暂无

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

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