我正在学习并创建我的第一个试图实现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>();
}
答案 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示例