我可以使用 MVVM 将字符串数组从视图传递到视图模型吗?

问题描述 投票:0回答:1

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

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

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

想法?

谢谢。

J

wpf mvvm data-binding
1个回答
0
投票

这里是一个使用

Binding
string[]
的解决方案示例。主窗口 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>
</Window>

现在是 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
    有实际的理解。
© www.soinside.com 2019 - 2024. All rights reserved.