C# 如何使用视图中的文本框值在Viewmodel中添加对象?
因此,我有一个mvvm结构化应用程序,希望在viewmodel中显示/编辑/向列表中添加对象, 我似乎无法理解如何从viewmodel中的文本框中获取值并创建新的paymentmethod添加到列表中 我看了很多线程,有些线程似乎可以工作,但在我自己的线程中实现给定的答案时却不行C# 如何使用视图中的文本框值在Viewmodel中添加对象?,c#,.net,xaml,mvvm,C#,.net,Xaml,Mvvm,因此,我有一个mvvm结构化应用程序,希望在viewmodel中显示/编辑/向列表中添加对象, 我似乎无法理解如何从viewmodel中的文本框中获取值并创建新的paymentmethod添加到列表中 我看了很多线程,有些线程似乎可以工作,但在我自己的线程中实现给定的答案时却不行 class PaymentMethod : INotifyPropertyChanged { public PaymentMethod(string name, double fixedRate, do
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
" HorizontalAlignment="Left" Margin="12,12,0,274" Name="label1" />
<Label Content="Fixed Rate
" HorizontalAlignment="Left" Margin="12,41,0,334" Name="label2" />
<Label Content="Variable Rate
" 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>