IntegerUpDown绑定问题

时间:2012-03-21 16:37:21

标签: wpf data-binding mvvm wpftoolkit

在我的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中的属性。

1 个答案:

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