c# - WPF 绑定不断更改已添加的项目
问题描述
我想做的是,我有一个名为 Ferramenta 的类,它应该包含 Atividades 类型的列表,这样我就可以继续将 Atividades 添加到给定的 Ferramenta 中。但是我遇到了麻烦,因为我可以很好地添加一个 Atividade,但是如果我去更改任何 TextBox 输入,它会自动更改 Atividades 列表中的 atividade,这没有意义,因为它应该是一个完全不同的范围。
我可以看到它与我键入的内容相同,因为我有一个显示内容的 DataGrid。
XAML:
<TextBox Margin="{StaticResource ControlMargin}"
Style="{DynamicResource MetroButtonTextBox}"
Text="{Binding Source={StaticResource vm},Path=atividade.Responsavel, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
Controls:TextBoxHelper.ClearTextButton="True"
/>
<DatePicker
Controls:TextBoxHelper.Watermark="Selecione uma data"
SelectedDate="{Binding Source={StaticResource vm},Path=atividade.DateInicio,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"/>
<DatePicker
Controls:TextBoxHelper.Watermark="Selecione uma data"
SelectedDate="{Binding Source={StaticResource vm},Path=atividade.DateTermino,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"/>
<Button Width="40"
Height="40"
Margin="20"
Style="{StaticResource AccentCircleButtonStyle}"
Command="{Binding Source={StaticResource vm},Path=addAtividade}"
CommandParameter="{Binding Source={StaticResource vm}, Path=atividade}">
</Button>
视图模型:
public AdicionarAtividade addAtividade { get; set; }
public Atividade atividade { get; set; }
public Ferramenta ferramenta { get; set; }
public ConsultaAtividadesViewModel(){
ferramenta = new Ferramenta()
{
OrdemServico = "12345", //Debugging purposes
SFerramenta = "123456",//Debugging purposes
Peca = "12345",//Debugging purposes
Atividades = new ObservableCollection<Atividade>()
};
addAtividade = new AdicionarAtividade(this);
atividade = new Atividade();
}
类 Ferramenta 的重要内容
class Ferramenta : INotifyPropertyChanged
{
private ObservableCollection<Atividade> atividades;
public ObservableCollection<Atividade> Atividades
{
get { return atividades; }
set { atividades = value; OnPropertyChanged("Atividades"); } //I think the problem is here on the setter
}
注册命令
ConsultaAtividadesViewModel vm { get; set; } //The View viewModel
public AdicionarAtividade(ConsultaAtividadesViewModel vm)
{
this.vm = vm;
}
//CanExecute stripped out for making it easier to understand
public void Execute(object parameter)
{
vm.ferramenta.Atividades.Add(parameter as Atividade);
}
另外我不知道是否值得添加,但我的想法是,在 XAML 中,我根据用户键入的内容更改已设置的 Atividade 项目,然后一旦他按下注册,ViewModel 中 Atividade 的参数就会传递给然后将其添加到列表中的命令,“打破”界限。
解决方案
必须更改 Atividade 构造函数以将 Atividade 作为参数并设置其变量并将执行更改为
vm.ferramenta.Atividades.Add(new Atividade((Atividade)parameter));
推荐阅读
- angular - 默认路由的角度默认路由
- docker - Logentries how to log /dev/stdout
- javascript - 在 localhost 中运行代码,应用名称为路由
- c# - Upload the video from iOS device to youtube Xamarin iOS
- javascript - 如何显示半径包含目标标记的谷歌地图标记?
- scala - 如何将 Set[String] 转换为 Map[String, String]?
- node.js - 使用 NodeJS 的 WooCommerce API 添加了不完整的产品变体
- java - 在 java 中解析来自 Amazon SQS 的 XML 通知?
- matplotlib - 如何在matplotlib中将x,y刻度对齐到框架
- angular - 角度材质单选按钮换行文本