簡體   English   中英

WPF ListBox從mvvm中選擇一項不再起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM