[英]WPF ListBox selecting an item from mvvm doesn't work anymore
我從后面的代碼中選擇綁定到WPF ListBox的選定項目的項目時遇到問題(我正在使用mvvm模式)。 奇怪的是,它曾經可以工作,但是現在不再了。 讓我介紹一下情況。
這是我的用戶控件中的列表框
<ListBox ItemsSource="{Binding TrainerClassesList}"
DisplayMemberPath="Description"
SelectedItem="{Binding SelectedTrainerClass, Mode=TwoWay}" />
這是所選項目綁定到的視圖模型中的屬性:
public TrainerClassClientEntity SelectedTrainerClass
{
get
{
return selectedTrainerClass;
}
set
{
if (EditingTrainerClass != null && !EditingTrainerClass.Equals(SelectedTrainerClass) && !EditingTrainerClass.Equals(value) && BtnSave.CanExecute(null))
{
MessageBoxResult result = MessageBox.Show("Unsaved changes will be lost. Do you want to save?",
"Attention",
MessageBoxButton.YesNo,
MessageBoxImage.Question,
MessageBoxResult.Yes);
if (result == MessageBoxResult.Yes)
{
BtnSave.Execute(null);
}
}
selectedTrainerClass = value;
EditingTrainerClass = Mapper.Clone<TrainerClassClientEntity>(selectedTrainerClass);
Raise(() => SelectedTrainerClass);
}
}
基本上發生的是,當您更改用戶控件等的文本框時,您不會直接更改所選項目。 您修改所選項目的副本,然后按保存按鈕(此處未顯示),更改即被應用。
我幾天前實現的是一個簡單的按鈕,該按鈕將一個項目添加到列表中並選擇了它。 它曾經可以工作,但是現在不行了。 這是按鈕的動作(我使用ICommand接口來執行該操作,我不會再費心復制和粘貼整個代碼)。
private void AddTrainerClass()
{
TrainerClassClientEntity trainerClass = new TrainerClassClientEntity();
ViewModel.TrainerClassesList.Add(trainerClass);
ViewModel.SelectedTrainerClass = trainerClass;
}
現在,我不知道該怎么做才能使其不再起作用。 通過調試,它確實可以工作,我了解到它確實可以更改視圖模型中的屬性,但是看來它不會更新用戶界面。
最近,我在文本框中添加了一些驗證器,這可能是問題嗎? 這是一個例子:
<TextBox Grid.Row="0" Grid.Column="1" Height="25" VerticalAlignment="Center" Margin ="10 5" >
<TextBox.Text>
<Binding Path="EditingTrainerClass.Description"
UpdateSourceTrigger="PropertyChanged"
Mode="TwoWay">
<Binding.ValidationRules>
<validators:StringNotNullOrWhiteSpaceValidationRule
ValidatesOnTargetUpdated="True"
ErrorMessage="The field cannot be empty."/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
另外,我認為值得一提的是,我正在使用自定義WPF主題。 但是,當我使用它時,它仍然可以正常工作。
預先感謝您的幫助。
您說有一種方法應該將更改應用到 [選定的項目],但是除非您從此方法中省略了一些代碼,否則它似乎不會應用任何更改...當然,您需要復制值從當前所選項目到新項目? 可能是這樣的:
private void AddTrainerClass()
{
TrainerClassClientEntity trainerClass = new TrainerClassClientEntity(
ViewModel.SelectedTrainerClass);
ViewModel.TrainerClassesList.Add(trainerClass);
ViewModel.SelectedTrainerClass = trainerClass;
}
或類似這樣的東西:
private void AddTrainerClass()
{
TrainerClassClientEntity trainerClass = new TrainerClassClientEntity();
trainerClass.CopyValuesFrom(ViewModel.SelectedTrainerClass);
ViewModel.TrainerClassesList.Add(trainerClass);
ViewModel.SelectedTrainerClass = trainerClass;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.