Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用视图中的文本框值在Viewmodel中添加对象?_C#_.net_Xaml_Mvvm - Fatal编程技术网

C# 如何使用视图中的文本框值在Viewmodel中添加对象?

C# 如何使用视图中的文本框值在Viewmodel中添加对象?,c#,.net,xaml,mvvm,C#,.net,Xaml,Mvvm,因此,我有一个mvvm结构化应用程序,希望在viewmodel中显示/编辑/向列表中添加对象, 我似乎无法理解如何从viewmodel中的文本框中获取值并创建新的paymentmethod添加到列表中 我看了很多线程,有些线程似乎可以工作,但在我自己的线程中实现给定的答案时却不行 class PaymentMethod : INotifyPropertyChanged { public PaymentMethod(string name, double fixedRate, do

因此,我有一个mvvm结构化应用程序,希望在viewmodel中显示/编辑/向列表中添加对象, 我似乎无法理解如何从viewmodel中的文本框中获取值并创建新的paymentmethod添加到列表中

我看了很多线程,有些线程似乎可以工作,但在我自己的线程中实现给定的答案时却不行

    class PaymentMethod : INotifyPropertyChanged
{
    public PaymentMethod(string name, double fixedRate, double variableRate)
    {
        Name = name;
        FixedRate = fixedRate;
        VariableRate = variableRate;
    }

    private string name;
    private double fixedrate;
    private double variablerate;

    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged("name");
        }
    }
    public double FixedRate
    {
        get
        {
            return fixedrate;
        }
        set
        {
            fixedrate = value;
            OnPropertyChanged("fixedrate");
        }
    }
    public double VariableRate
    {
        get
        {
            return variablerate;
        }
        set
        {
            variablerate = value;
            OnPropertyChanged("variablerate");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
视图模型:

    class PaymentMethodViewModel
{
    private IList<PaymentMethod> _paymentMethods;

    public PaymentMethodViewModel()
    {
        _paymentMethods = new List<PaymentMethod>
        {
            new PaymentMethod("bancontact",0.5,1),
            new PaymentMethod("ideal",0.29,0),
        };
    }
    public IList<PaymentMethod> PaymentMethods
    {
        get { return _paymentMethods; }
        set { _paymentMethods = value; }
    }

    private ICommand mUpdater;
    public ICommand UpdateCommand
    {
        get
        {
            if (mUpdater == null)
                mUpdater = new Updater();
            return mUpdater;
        }
        set
        {
            mUpdater = value;
        }
    }
    private class Updater : ICommand
    {
        #region ICommand Members  

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {

        }

        #endregion
    }
}
class PaymentMethodViewModel
{
私人IList_支付方法;
公共支付方法视图模型()
{
_paymentMethods=新列表
{
新的付款方法(“bancontact”,0.5,1),
新的支付方法(“理想”,0.29,0),
};
}
公共IList支付方法
{
获取{return\u paymentMethods;}
设置{u paymentMethods=value;}
}
私人ICommand mUpdater;
公共ICommand更新命令
{
得到
{
if(mUpdater==null)
mUpdater=新的更新程序();
返回mUpdater;
}
设置
{
mUpdater=值;
}
}
私有类更新程序:ICommand
{
#区域ICommand成员
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件处理程序CanExecuteChanged;
public void Execute(对象参数)
{
}
#端区
}
}
xaml



我通过在我的Viewmodel中添加绑定到新属性的新文本框来修复它,如果我单击“添加新btn”,Viewmodel只会读取自己的属性并将其添加到ObservableCollection列表中并自动更新。

你在问命令是如何工作的吗?您有
CommandParameter
。或者,您可以在视图模型中提供其他方式来检索“视图状态”(选定项、鼠标覆盖项等)。@Sinatr我想我需要检查命令的工作原理,我是否可以将文本框的多个值合并到一个
CommandParameter
?如果可以链接一些资源,将是伟大的多个值?您正在编辑
SelectedItem
,将其作为命令参数传递。或者(更好)将
SelectedItem
绑定到视图模型中的属性,使其始终可用。因此它不是选中项?那么为什么要将
文本框
绑定到
SelectedItem
?在视图模型中创建一个新的属性来创建新的项(如窗体,右?),并使用该内部命令。如果使用相同的控件也编辑选定的项,则考虑首先将新项目添加到列表中,选择该项并编辑它。顺便说一句,它应该是一个
可观察集合
,以便在视图中轻松显示集合本身的更改。
    <Grid Background="#FFE5E5E5">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="68*"/>
        <ColumnDefinition Width="329*"/>
    </Grid.ColumnDefinitions>
    <ListView Name="Paymentmethodgrid" Margin="4,178,12,13" ItemsSource="{Binding PaymentMethods}" Grid.ColumnSpan="2">
        <ListView.View>
            <GridView x:Name="grdTest">
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"  Width="50"/>
                <GridViewColumn Header="Fixed rate" DisplayMemberBinding="{Binding FixedRate}"  Width="80" />
                <GridViewColumn Header="Variable rate" DisplayMemberBinding="{Binding VariableRate}" Width="100" />
            </GridView>
        </ListView.View>
    </ListView>
    <Label Content="Name&#xD;&#xA;" HorizontalAlignment="Left" Margin="12,12,0,274" Name="label1" />
    <Label Content="Fixed Rate&#xD;&#xA;" HorizontalAlignment="Left" Margin="12,41,0,334" Name="label2" />
    <Label Content="Variable Rate&#xD;&#xA;" HorizontalAlignment="Left" Margin="12,72,0,303" x:Name="label2_Copy" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="115,10,0,0" Name="txtUserId" VerticalAlignment="Top" Width="178" Text="{Binding ElementName=Paymentmethodgrid,Path=SelectedItem.Name}" Grid.ColumnSpan="2" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="115,45,0,0" x:Name="txtUserId_Copy" VerticalAlignment="Top" Width="178" Text="{Binding ElementName=Paymentmethodgrid,Path=SelectedItem.FixedRate}" Grid.ColumnSpan="2" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="115,80,0,0" x:Name="txtUserId_Copy1" VerticalAlignment="Top" Width="178" Text="{Binding ElementName=Paymentmethodgrid,Path=SelectedItem.VariableRate}" Grid.ColumnSpan="2" />
    <Button Content="Update" Height="23" HorizontalAlignment="Left" Margin="174,40,0,0" Name="UpdatePaymentMethod"   
            VerticalAlignment="Top" Width="141"  
            Command="{Binding Path=UpdateCommad}" Grid.Column="1"  />
</Grid>