【问题标题】:why ComboBox selectedItem does not call the set accessor为什么 ComboBox selectedItem 不调用 set 访问器
【发布时间】:2012-03-19 14:23:41
【问题描述】:

在我的项目中,我将一个可观察的集合绑定到一个数据网格。每列数据网格有一个组合框,它是绑定属性并返回字符串列表。组合框的选定项绑定到我的可观察集合的另一个属性。 get 访问器在组合框中工作正常,但集合不起作用。我需要它来工作,因为我必须将更改保存到我的数据库中。

这是我的 XAML 的一部分

<DataGrid  SelectedItem="{Binding SelectedPartProperty, Mode=TwoWay}"
              ItemsSource="{Binding AllPartProperties}" AutoGenerateColumns="False" Grid.Row="1" Margin="416,6,302,0">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding PropertyName,Mode=TwoWay}" IsReadOnly="false"/>
            <DataGridTemplateColumn Header="Data Type" IsReadOnly="false">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox SelectedItem="{Binding PropertyDataType, Mode=TwoWay}"
                           ItemsSource="{Binding DataType}" 
                           Background="White" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>
    </DataGrid>

我的主视图模型

public ObservableCollection<PartPropertyViewModel> AllPartProperties
    {
        get
        {
            if (SelectedPartNumber == null)
            {
                _allProperties = new ObservableCollection<PartPropertyViewModel>();
                return _allProperties;
            }
            PartPropertyViewModel tempPartPropertyViewModel;
            ObservableCollection<PartPropertyViewModel> newPartPropertyViewModel = new ObservableCollection<PartPropertyViewModel>();
            foreach (PartProperty p in SelectedPartNumber.PartNumberEntity.PartProperties)
            {
                tempPartPropertyViewModel = new PartPropertyViewModel(p);
                newPartPropertyViewModel.Add(tempPartPropertyViewModel);
            }

            _allProperties = newPartPropertyViewModel;
            return _allProperties;
        }
        set
        {
            _allProperties = value;              

        }

    }

另一个视图模型

class PartPropertyViewModel : ViewModelBase
{
    private PartProperty _partPropertyEntity;      
    private string _propertyDataType;
    private string[] _dataType;
    private PartParameterViewModel _partParameters;

    public PartPropertyViewModel(PartProperty partProperty)
    {
        PartPropertyEntity = partProperty;
        _partParameters = new PartParameterViewModel(partProperty);
    }

    //public PartPropertyViewModel()
    //{
    //    //PartPropertyEntity = new PartProperty();           
    //}


    public PartProperty PartPropertyEntity
    {
        get 
        {
            return _partPropertyEntity;
        }
        set 
        {
            _partPropertyEntity = value;
        }
    }
    public string PropertyName
    {
        get
        {
            if (PartPropertyEntity == null ||  PartPropertyEntity.ConfigurationProperty == null)
                return "";
            else
                return PartPropertyEntity.ConfigurationProperty.chrCPProperty;
        }
        set
        {
            PartPropertyEntity.ConfigurationProperty.chrCPProperty = value;
            OnPropertyChanged("PropertyName");
        }
    }

    public string[] DataType
    {
        get 
        {
            _dataType = new string[] { "Number", "String"};                
            return _dataType;
        }
        set
        {
            _dataType = value;
            OnPropertyChanged("DataType");
            OnPropertyChanged("PropertyDataType");
        }

    }
    public string PropertyDataType
    {
        get
        {
            if (PartPropertyEntity == null || PartPropertyEntity.ConfigurationProperty == null)
                return "";

            if (PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric)
                _propertyDataType = DataType[0];
            else
                _propertyDataType = DataType[1];
            return _propertyDataType;
        }
        set
        {
            _propertyDataType = value;

            if (String.Compare(value,"Number") == 0)
                PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric = true;
            else
                PartPropertyEntity.ConfigurationProperty.bitCPIsNumeric = false;

            OnPropertyChanged("PropertyDataType");
        }
    }



    public PartParameterViewModel PartParameters
    {
        get
        {
           return  _partParameters;
        }
    }

}//end of class

【问题讨论】:

    标签: wpf data-binding mvvm combobox


    【解决方案1】:

    你正在绑定到一个字符串数组

      public string[] DataType 
    

    String 没有属性 PropertyDataType,我也怀疑 get 是否被调用。

    需要绑定到 List 或 ObservableCollection 之类的集合

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 2021-10-13
      • 2017-01-01
      • 1970-01-01
      • 2011-04-27
      • 2013-11-11
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多