wpf - 获取 ViewModel 中的 TextBox 值

标签 wpf xaml mvvm

任何人请举例告诉我,如何在 View 模型中获取文本框值,我的模型属性已经以两种方式与文本框绑定(bind)

enter image description here

这是我的 View 模型函数,我想将新记录添加到我的可观察集合中。

C#

public void AddPerson()
{
  // add new record
}

private Model.Person _PersonData;
public Model.Person PersonData
{
    get {
        if(_PersonData==null)
        {
            _PersonData = new Person();
        }
        return _PersonData;
        }
    set
    {
        Setproperty(ref this._PersonData, value);
    }
}

XAML

<Controls:MetroWindow
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    xmlns:VM="clr-namespace:Demo.ViewModel"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Model="clr-namespace:Demo.Model" mc:Ignorable="d" x:Class="Demo.MainWindow"
    Title="MainWindow" Height="438" Width="664"
    GlowBrush="{DynamicResource AccentColorBrush}"              
    WindowStartupLocation="CenterScreen">
<Controls:MetroWindow.Resources>
    <Model:Person x:Key="PersonDataSource" d:IsDataSource="True"/>
    <VM:MainViewModel x:Key="MainViewModelDataSource" d:IsDataSource="True"/>
</Controls:MetroWindow.Resources>

   <Controls:MetroWindow.RightWindowCommands>
    <Controls:WindowCommands>
        <!--<Button Content="settings" />-->
        <Button>
            <StackPanel Orientation="Horizontal">
                <Rectangle Width="20"
               Height="20"
               Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
                    <Rectangle.OpacityMask>
                        <VisualBrush Stretch="Fill" Visual="{StaticResource appbar_futurama_fry}" />
                    </Rectangle.OpacityMask>
                </Rectangle>
                <TextBlock Margin="4 0 0 0"
               VerticalAlignment="Center"
               Text="Karthik" />
            </StackPanel>
        </Button>
    </Controls:WindowCommands>
</Controls:MetroWindow.RightWindowCommands>


<Grid DataContext="{Binding Source={StaticResource MainViewModelDataSource}}">
    <Grid.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FFF3F3F3" Offset="0"/>
            <GradientStop Color="#FFFBF9F9" Offset="1"/>
            <GradientStop Color="#FFF7F6F6" Offset="0.555"/>
        </LinearGradientBrush>
    </Grid.Background>
    <Border BorderThickness="3" HorizontalAlignment="Left" Height="388" Margin="10,10,0,0" VerticalAlignment="Top" Width="636" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.168,0.166" StartPoint="0.168,0.08">
                <GradientStop Color="#FF39D5FF" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
        <Label Content="Master Details" Margin="10,1,502,352" FontWeight="Bold" Foreground="White"/>
    </Border>

    <Border BorderBrush="#FFC7C2C2" BorderThickness="1" HorizontalAlignment="Left" Height="238" Margin="21,100,0,0" VerticalAlignment="Top" Width="187" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.433,0.407" StartPoint="0.435,0.134">
                <GradientStop Color="#29c5ff" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
    </Border>
    <Border BorderBrush="#FFC7C2C2" BorderThickness="1" HorizontalAlignment="Left" Height="239" Margin="227,100,0,0" VerticalAlignment="Top" Width="405" CornerRadius="3">
        <Border.Background>
            <LinearGradientBrush EndPoint="0.435,0.378" StartPoint="0.435,0.134">
                <GradientStop Color="#29c5ff" Offset="0"/>
                <GradientStop Color="White"/>
            </LinearGradientBrush>
        </Border.Background>
        <Button Content="DELETE" Margin="211,189,41,21" Width="149" Height="21"/>
    </Border>
    <Label Content="New" HorizontalAlignment="Left" Height="29" Margin="37,103,0,0" VerticalAlignment="Top" Width="87" Foreground="White"/>
    <Label Content="Update" HorizontalAlignment="Left" Height="25" Margin="246,105,0,0" VerticalAlignment="Top" Width="98" Foreground="White"/>
    <TextBox HorizontalAlignment="Left" Height="25" Margin="37,150,0,0" TextWrapping="Wrap" Text="{Binding Path=Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>
    <TextBox HorizontalAlignment="Left" Height="19" Margin="37,197,0,0" TextWrapping="Wrap" Text="{Binding Path=ID,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>
    <Button Content="Update" HorizontalAlignment="Left" Height="24" Margin="37,291,0,0" VerticalAlignment="Top" Width="149"/>
    <Button Command="{Binding _addCommand}" Content="edit" HorizontalAlignment="Left" Height="21" Margin="272,291,0,0" VerticalAlignment="Top" Width="149"/>
    <ListView HorizontalAlignment="Left" Height="120" Margin="246,150,0,0" VerticalAlignment="Top" Width="366"  ItemsSource="{Binding MasterData}">
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Name" Width="120">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" TextWrapping="Wrap"/>  
                        </DataTemplate>   
                    </GridViewColumn.CellTemplate>    
                </GridViewColumn>
                <GridViewColumn Header="ID" Width="120">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ID}" TextWrapping="Wrap"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Location" Width="125">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Location}" TextWrapping="Wrap"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    <TextBox HorizontalAlignment="Left" Height="19" Margin="37,241,0,0" TextWrapping="Wrap" Text="{Binding Path=Location,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="149" DataContext="{Binding Source={StaticResource PersonDataSource}}"/>

</Grid>
</Controls:MetroWindow>

最佳答案

因为我无法使用您的代码片段准确地重现您的问题。因此,我制作了一个简单的代码示例来实现您所描述的目标。我相信您会从中获得一些有用的信息并检查您的代码以解决您的问题。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition>

        </ColumnDefinition>
        <ColumnDefinition>

        </ColumnDefinition>
    </Grid.ColumnDefinitions>

    <StackPanel Grid.Column="0">
        <TextBox Text="{Binding name,Mode=TwoWay}"></TextBox>

        <TextBox Text="{Binding Id,Mode=TwoWay}"></TextBox>

        <TextBox Text="{Binding location,Mode=TwoWay}"></TextBox>

        <Button Content="add new" Command="{Binding AddNew}"></Button>
    </StackPanel>

    <ListView ItemsSource="{Binding persons}" Grid.Column="1">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"></TextBlock>
                    <TextBlock Text="{Binding ID}" Margin="10 0 0 0"></TextBlock>

                    <TextBlock Text="{Binding Location}" Margin="20 0 0 0"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

MainViewModel.cs

class MainViewModel:ViewModelBase
{
    public ObservableCollection<PersonModel> persons { get; set; }

    private string _name;
    public string name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged("name");
        }
    }

    private string _Id;

    public string Id
    {
        get { return _Id; }
        set { _Id = value;
            RaisePropertyChanged("Id");
        }
    }

    private string _location;

    public string location
    {
        get { return _location; }
        set { _location = value;
            RaisePropertyChanged("location");
        }
    }

    public RelayCommand AddNew { get; set; }


    public MainViewModel()
    {
        persons = new ObservableCollection<PersonModel>();
        persons.Add(new PersonModel() {Name="test1",ID="123",Location="u.s." });
        AddNew = new RelayCommand(AddNewPerson);
    }

    private void AddNewPerson()
    {
        PersonModel p = new PersonModel() {Name=name,ID=Id,Location=location };
        persons.Add(p);
    }
}

PersonModel.cs

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

    public string ID { get; set; }

    public string Location { get; set; }
}

enter image description here

关于wpf - 获取 ViewModel 中的 TextBox 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39375074/

相关文章:

wpf - 设置Window.Datacontext

c# - WPF 中的源绑定(bind),如 Asp.Net

c# - 如何在 WPF 应用程序中结合使用 MVVM 和依赖注入(inject)?

c# - 从另一个项目的可执行文件启动一个项目的可执行文件

wpf - 无法为Xceed.Wpf.Toolkit.MessageBox.Show设置父项

wpf - MVVM-如何以编程方式为我的 View 模型选择 View ?

c# - 抽象 ViewModel 在被继承时是否被视为模型?

c# - WPF 功能区以编程方式折叠和展开

c# - WPF XAML 序列化/反序列化

Wpf 样式 : Binding to Child Property via ElementName