在我的WPF应用程序中,我有一个数据网格,其中一个IntegerUpDown控件显示在一列中,并且它绑定到我的viewmodel中的一个属性:
<DataGridTemplateColumn Header="Qty">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<toolkit:IntegerUpDown Minimum="1" Maximum="999" Value="{Binding SelectedQuantity, Mode=TwoWay}" Increment="1" HorizontalAlignment="Left" Margin="0,0,0,0" Name="integerUpDown1" VerticalAlignment="Top" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
它似乎只是单向绑定。最初在我的viewmodel中设置的值显示在控件中,但是当我更改控件的值时,它不会更新viewmodel。我已确保更改控件的值然后按Tab键或输入以失去焦点并触发更新但仍然没有运气。我的viewmodel非常简单,这里是SelectedQuantity属性
public int SelectedQuantity
{
get
{
return _selectedQuantity;
}
set
{
if (value != _selectedQuantity)
{
_selectedQuantity = value;
OnPropertyChanged("SelectedQuantity");
}
}
}
private int _selectedQuantity;
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
它可能与Automapper有关?我使用Automapper将我的模型映射到我的viewmodel。我最初认为我可能需要在此属性上使用Automappers“Ignore”,但在尝试之后仍存在同样的问题。 SelectedQuantity不是我的模型对象中的属性。也许它与DataGridTemplateColumns有关?
修改
似乎没有任何东西实际上与datagrid正确绑定(虽然视图中的其他控件正确绑定):(这就是我填充我的ObservableCollection<ProductViewModel>
对象的方式
public void Search()
{
_viewModel.SearchResults.Clear();
List<ProductViewModel> searchResults = Mapper.Map<List<Product>, List<ProductViewModel>>(_productService.SearchProducts(_viewModel.SearchValue));
foreach (ProductViewModel pvm in searchResults)
{
_viewModel.SearchResults.Add(pvm);
}
}
编辑2:
我的DataGrid绑定到ObservableCollection<ProductViewModel>
对象,如此ItemsSource="{Binding SearchResults}"
我在DataGrid中正确地看到了项目,更改只是没有反映在viewmodel中。 SelectedQuantity是ProductViewModel中的属性。
答案 0 :(得分:3)
我认为你正在混合绑定。 datagrid可能绑定到ObservableCollection(如果不是,我会从那里开始)。行级别的项上下文是单个对象,它是应具有SelectedQuantity属性的对象,以便XAML正常工作。如果它在你的包含视图模型中,这将不起作用,因为多行将绑定到同一属性,我认为它不会给你你想要的效果。
尝试添加一些代码,以查看退出行后是否正在发送值:
<b:Interaction.Triggers>
<b:EventTrigger EventName="RowEditEnding">
<b:InvokeCommandAction Command="{Binding RowEditEndingCommand}" CommandParameter="{Binding }"/>
</b:EventTrigger>
</b:Interaction.Triggers>