模型属性未在WPF MVVM项目中访问Set Accessor

时间:2015-03-30 19:41:31

标签: c# wpf mvvm

我正在学习并创建我的第一个试图实现MVVM设计模式的WPF应用程序,但是我似乎无法弄清楚为什么这个属性没有触发它的Set Accessor,所以我可以使用我拥有的OnPropertyChanged方法。我真的很感激为什么这不符合我的预期。

我不明白的部分是在ViewModel的GetChargeUnits方法中我创建了一个我的Charge Unit Model的实例,并将Property设置为读者的结果(这个读者确实返回了一个结果)属性集精细?但是当它单步执行时,它永远不会碰到属性中的Set行,所以我无法检测它是否已经改变。在这个方法评论的部分是我最初尝试了许多组合。

请帮忙,谢谢

型号:

public class ChargeUnit : INotifyPropertyChanged
{
    private string _chargeUnitDescription;
    private int _chargeUnitListValueId;
    public event PropertyChangedEventHandler PropertyChanged;

    public ChargeUnit()
    {

    }
    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public string ChargeUnitDescription
    {
        get { return _chargeUnitDescription; }
        set
        {
            _chargeUnitDescription = value;
            OnPropertyChanged("ChargeUnitDescription");
        }
    }

    public int ChargeUnitListValueId
    {
        get { return _chargeUnitListValueId; }
        set
        {
            _chargeUnitListValueId = value;
            OnPropertyChanged("ChargeUnitListValueId");
        }
    }

视图模型:

public class ClientRatesViewModel
{
    private IList<ClientRates> _clientRatesPreAwr;
    private IList<ClientRates> _clientRatesPostAwr;
    private List<ChargeUnit> _chargeUnits;
    private const string _connectionString = @"connectionString....";
    public ClientRatesViewModel()
    {
        _clientRatesPreAwr = new List<ClientRates>
        {
            new ClientRates {ClientRatesPreAwr = "Basic"}
        };

        _clientRatesPostAwr = new List<ClientRates>
        {
            new ClientRates{ClientRatesPostAwr = "Basic Post AWR"}
        };

        _chargeUnits = new List<ChargeUnit>();
    }

    public IList<ClientRates> ClientRatesPreAwr
    {
        get { return _clientRatesPreAwr; }
        set { _clientRatesPreAwr = value; }
    }

    public IList<ClientRates> ClientRatesPostAwr
    {
        get { return _clientRatesPostAwr; }
        set { _clientRatesPostAwr = value; }
    }

    public List<ChargeUnit> ChargeUnits
    {
        get { return _chargeUnits; }
        set { _chargeUnits = value; }
    }

    public List<ChargeUnit> GetChargeUnits()
    {
        using (var connection = new SqlConnection(_connectionString))
        {
            connection.Open();
            using (var command = new SqlCommand("SELECT LV.ListValueId, LV.ValueName FROM tablename", connection))
            {
                command.CommandType = CommandType.Text;

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var test = new ChargeUnit();
                        test.ChargeUnitDescription = reader["ValueName"].ToString();
                        //_chargeUnits.Add(new ChargeUnit
                        //{
                        //    ChargeUnitDescription = reader["ValueName"].ToString(),
                        //    ChargeUnitListValueId = (int)reader["ListValueId"]
                        //});
                    }
                }


            }

        }
        return new List<ChargeUnit>();
    }

1 个答案:

答案 0 :(得分:0)

我认为存在误解。

以这种方式思考:为什么模型中的ChargeUnitDescription会发生变化?您没有更改该属性的内容。

您所描述的是,您正在更改SelectedItem的{​​{1}}。模型实例的ComboBox被点击,因为get需要访问它以显示您在绑定中使用ComboBox DisplayMemberPath属性定义的字符串。 1}}。

您感兴趣的是ComboBox的{​​{1}}或SelectedItem(取决于您的设置)。

这是一个最简单的例子来说明这一点:

SelectedValue

和相应的xaml:

ComboBox

更新:

更改了代码,以便将所选项填充到ViewModel的属性中。如果你在setter中设置一个断点,那么如果你在ComboBox中选择一些东西就会被击中。

对于将来可能会问的问题,请提供一个Minimal, Complete, and Verifiable example并根据相应情况提出相关问题。这样可以节省很多时间。

更新2: 将INotifyPropertyChanged添加到ViewModel示例