【问题标题】:Can I pass a string array from view to viewmodel using MVVM?我可以使用 MVVM 将字符串数组从视图传递到视图模型吗?
【发布时间】:2017-04-27 23:24:05
【问题描述】:

我有一个场景,我希望能够在 UI 中收集字符串数组...视图模型不应该关心字符串是如何收集的...并将该字符串数组传递给视图模型。

是否有一个 WPF 控件可以绑定到不需要它是 itemsSource 的字符串数组?

我希望视图模型能够将数组作为一个整体进行处理。这似乎应该是一件简单的事情,但我只是没有找到解决方案。我正在考虑使用一个文本框,只是分隔字符串并在视图模型中将其分开。

想法?

谢谢。

J

【问题讨论】:

  • ItemsSource 有什么困扰吗?一个简单的ItemsControl 绑定到带有项目模板中的文本框的可观察字符串数组将起作用。只需将添加(也可能是删除)按钮绑定到操作可观察数组的命令。
  • 您是否想说您想将数组传递给视图模型以进行处理?在这种情况下,您可能不想将其绑定到属性,而是将其作为命令的参数传递。
  • 我希望数组作为一个单元传递,而不是单独传递,因为它们被添加到 ItemsControl。在某些情况下(拖放),触发器不一定附加命令。如果它是一个项目而不是多个项目,我想用不同的 UI 响应。
  • 如果您使用的是MvvM,那么您的集合已经在您的视图模型中,Binding 负责显示项目。看起来您在这里没有使用 Binding。如何在 UI 中填充项目列表?
  • @XAMlMAX,如果我能弄清楚如何将字符串数组作为原子对象绑定,我会使用绑定。

标签: wpf mvvm data-binding


【解决方案1】:

这是一个解决方案的示例,该解决方案使用 Bindingstring[]
主窗口 xaml:

<Window x:Class="SO_app.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:VM;assembly=VM"
    xmlns:local="clr-namespace:SO_app"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <vm:MainViewModel/>
</Window.DataContext>
<Grid>
    <ListView ItemsSource="{Binding Items}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding .}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

现在是 ViewModel(基础):

namespace VM
{
    public class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string prop)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }
    }
}

现在是主视图模型:

namespace VM
{
    public class MainViewModel : BaseViewModel
    {
        public MainViewModel()
        {
            Items = new string[10];
            Items[0] = "First string";
            Items[1] = "Second string";
        }

        private string[] _items;

        public string[] Items
        {
            get { return _items; }
            set { _items = value; OnPropertyChanged("Items"); }
        }
    }
}  

这样您的Binding 将起作用,您将可以访问您的视图模型中的集合。
如果您在这方面需要更多帮助,请告诉我们。
假设

  1. 您可以在解决方案中使用引用并分配它们。
  2. 您对Binding有工作理解。

愉快的编码

【讨论】:

  • 在这种情况下,setter 会在每个项目被添加到列表框时被调用,不是吗?我希望能够将整个数组分配为原子分配,以便仅在分配整个数组时触发视图模型。
  • @DigitalCamel 当数组完成/已满以处理它时,是什么阻止您创建按钮?
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2020-02-08
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多