【问题标题】:How to code a UWP MVVM ComboBox within an ItemTemplate?如何在 ItemTemplate 中编写 UWP MVVM ComboBox?
【发布时间】:2016-10-30 00:17:47
【问题描述】:

我试图弄清楚如何在 ComboBox 中显示所选项目的类别,该组合框本身位于 GridView.ItemsTemplate 中。到目前为止,我尝试过的任何方法都没有奏效。我试过使用 SelectedValue 和 SelectedValuePath。 我可以在 GridView.ItemsTemplate 中的文本框中显示项目的类别,但不能在 ComboBox 中显示集合。

// FiledNotesPageViewModel ViewModel
public class FiledNotesPageViewModel : ViewModelBase
{
public ObservableCollection<MemoryItem> NoteItems { get; set; } = new ObservableCollection<MemoryItem>();
}

// Public Properties
        public int FiledNotesId
    {
        get
        {
            return _filedNotesId;
        }
        set
        {
            _filedNotesId = value;
            OnPropertyChanged("FiledNotesId");
        }
    }
            public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
    public string Note
    {
        get
        {
            return _note;
        }
        set
        {
            _note = value;
            OnPropertyChanged("Note");
        }
    }
    public string Category
    {
        get
        {
            return _category;
        }
        set
        {
            _category = value;
            OnPropertyChanged("Category");
        }
    }

// MemoryItem Model

    public int FiledNotesId { get; set; }

    public string Note { get; set; } 

    public string Name { get; set; }

    public string Category { get; set; }

归档笔记页面视图

 <GridView x:Name="FiledNotesGrid"
              RelativePanel.Below="FilterNoteGrid"
              ItemsSource="{x:Bind ViewModel.NoteItems}">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid Orientation="Horizontal" 
                               Margin="5"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:MemoryItem">                    
                <StackPanel Orientation="Vertical" 
                            BorderBrush="{ThemeResource AppBarBorderThemeBrush}" 
                            BorderThickness="2,2,2,4" 
                            Margin="20"
                            Background="#FFF7F713" >
                    <TextBox x:Name="NoteNameTextBox" 
                             Text="{x:Bind Name, Mode=TwoWay}"/>
                    <TextBox x:Name="NoteTextBox"
                             TextWrapping="Wrap"
                             AcceptsReturn="True"
                             Text="{x:Bind Note, Mode=TwoWay}"/>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Margin="5,0">Category:</TextBlock>
                        <ComboBox x:Name="NoteCategoryComboBox"
                                  SelectedItem="{Binding FiledNotesId, Mode=TwoWay}"
                                  MinWidth="125">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Category}" />
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

【问题讨论】:

    标签: mvvm combobox uwp


    【解决方案1】:

    您的组合框没有ItemsSource

    你需要做这样的事情......

    在您的 CS 文件中创建要绑定的 ObservableCollection 属性。

    public ObservableCollection<int> FieldNoteIds {get; set;}
    

    在你看来,绑定到你的收藏

    <ComboBox ItemsSource="{Binding FieldNoteIds}">
    

    现在,您提供了一个模板,用于显示填充到组合框中的每个项目,但您没有给它任何填充内容。

    关于组合框和绑定的 MSDN 教程

    https://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82#content

    【讨论】:

    • 将 ItemsSource="{Binding NoteItems}" 添加到 ComboBox,会产生以下错误。因为在 GridView DataTemplate 中将 DataType 设置为 Model MemoryItem,所以 ComboBox 无法将 DataType 改回 FiledNotedPageViewModel。错误:Error: BindingExpression path error: 'NoteItems' property not found on 'MyApp.Models.MemoryItem'. BindingExpression: Path='NoteItems' DataItem='MyApp.Models.MemoryItem'; target element is 'Windows.UI.Xaml.Controls.ComboBox' (Name='NoteCategoryComboBox'); target property is 'ItemsSource' (type 'Object')
    • 看看错误。它在告诉你什么?这是说它在您的模型 MemoryItem 上找不到集合 NoteItems。如果我是一个赌徒,我会说网格中的每一行都是一个 MemoryItem。那是因为您的组合框也在寻找您要绑定的属性的继承数据上下文(它所在的行)。
    • 换句话说,每个 MemoryItem 模型都需要包含特定于它的组合框集合
    • 这是我不明白的部分。该集合是 FiledNotesPageViewModel 中的一个可观察集合 NoteItems。如果我将我的集合移动到模型中,那么 ViewModel 中的任何代码都无法访问它,并且它不会使用 MVVM 模式。我错过了什么,还是有解决方法?
    • 不,您需要两个集合。一个集合是用于您的网格的 MemoryItem。然后在每个内存项中,您需要一个 FieldNoteId 的集合
    猜你喜欢
    • 2018-10-10
    • 2016-07-09
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2023-03-22
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多