2012-03-21 154 views
2

在我的WPF应用程序,我有一列显示的IntegerUpDown控制与其绑定的属性在我的视图模型一个DataGrid:IntegerUpDown绑定问题

<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> 

这似乎是只有1个双向绑定。最初在我的视图模型中设置的值显示在控件中,但是当我更改控件的值时,它不会更新视图模型。我已经确保改变控制的价值,然后按下标签或输入失去焦点,并触发更新,但仍然没有运气。我的视图模型是相当简单的,这里的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中正确的项目,更改只是没有反映在视图模型中。 SelectedQuantity是ProductViewModel中的一个属性。

+0

有没有被绑定到DataGrid的集合?如果是的话,SelectedQuantity是绑定集合中的对象的成员,还是在托管DataGrid的窗口/控件的视图模型中? – Josh 2012-03-21 16:45:23

+0

@Josh请参阅编辑2 – 2012-03-21 16:51:17

回答

3

我想你是混合绑定。 DataGrid可能绑定到ObservableCollection(如果不是,我会从那里开始)。行级别的项目上下文是单个对象,它是应该具有SelectedQuantity属性才能使XAML正常工作的对象。如果它包含在你的视图模型中,这将不起作用,因为多行将被绑定到相同的属性,我不认为它会给你你寻找的效果。

尝试添加一些代码来看看它的值被发送,一旦你退出该行:

<b:Interaction.Triggers> 
    <b:EventTrigger EventName="RowEditEnding"> 
     <b:InvokeCommandAction Command="{Binding RowEditEndingCommand}" CommandParameter="{Binding }"/> 
    </b:EventTrigger> 
</b:Interaction.Triggers> 
+0

在View构造函数中,我将this.DataContext设置为ViewModel。 ViewModel包含一个ObservableCollection,然后绑定到DataGrid ItemsSource,就像ItemsSource =“{Binding SearchResults}”一样。我确实看到数据填充在数据网格中,更改只是没有反映在视图模型 – 2012-03-21 16:48:00

+0

Thie line'Value =“{Binding SelectedQuantity,Mode = TwoWay}”'暗示SelectedQuantity位于ProductViewModel上。那是它存在的位置,还是包含“SearchResults”作为属性的相同视图模型上的SelectedQuantity属性? – Josh 2012-03-21 16:59:36

+0

它在ProductViewModel中。 – 2012-03-21 17:04:21