簡體   English   中英

Wpf 棱鏡通知屬性已更改,未設置驗證

[英]Wpf prism Notify property changed with validation not set

我剛開始使用帶有 wpf 的棱鏡,不明白為什么我的屬性沒有更新。 我有一個帶有驗證的文本塊綁定,它一直有效,直到我刪除最后一個字符。 看了下調試器,沒有調用set屬性,而是調用了驗證方法。 另外,我不明白更新 can 執行方法是如何工作的。 當我在文本框中輸入字符時,它會觸發返回 true,但刪除后它不會更新。 我將不勝感激,這是我的代碼。

我的視圖模型(構造函數中的這個命令)

SaveCommand = new DelegateCommand(ExecuteSaveCommand, CanExecuteSaveCommand);

 public string ImageTitle
 {
      get => _userImageModel.Title;
      set
      {
          _userImageModel.Title = value;
          RaisePropertyChanged(); 
          SaveCommand.CanExecute();
      }
 }

private bool CanExecuteSaveCommand()
{
        var x = string.IsNullOrWhiteSpace(_userImageModel.Title) == false || 
                                              _userImageModel.Title!=null;
        return x;
}

我的驗證規則

public class UserImageValidator : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value == null)
            return new ValidationResult(false,"value cannot be empty");

        if(!(value is string propertyValue))
            return new ValidationResult(false,"exception");

        if(string.IsNullOrWhiteSpace(propertyValue))
            return new ValidationResult(false,"Required");

        return ValidationResult.ValidResult;
    }
}

我的觀點

 <TextBox
        Grid.Row="0"
        Grid.Column="1"
        MinWidth="200"
        Margin="5"
        VerticalAlignment="Center"
        MinLines="4"
        Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
        <TextBox.Text>
          <Binding Path="ImageTitle" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
              <validateRule:UserImageValidator />
            </Binding.ValidationRules>
          </Binding>
        </TextBox.Text>
      </TextBox>

我不明白更新 can 執行方法是如何工作的。

您改為在命令上調用RaiseCanExecuteChanged 例如,框架調用CanExecute來確定按鈕是否啟用。

另外, string.IsNullOrWhiteSpace(_userImageModel.Title) == false || _userImageModel.Title!=null string.IsNullOrWhiteSpace(_userImageModel.Title) == false || _userImageModel.Title!=null沒有多大意義( != null對於空白字符串是正確的),你的意思是.string.IsNullOrWhiteSpace( _userImageModel.Title )嗎?

檢查這個屬性,_userImageModel.Title,它在那里設置屬性。 SaveCommand 也沒有連接到文本框。

我找到了解決我的問題的方法。 就我們使用驗證而言,如果值不正確,則不會設置它是合乎邏輯的。 這可以通過設置驗證步驟 = 承諾值來避免。 但是,在那之后,在驗證 class 中,我們不會獲取值,而是表達式綁定(要獲取值,只需使用此鏈接上的解決方案ValidationRule with ValidationStep="UpdatedValue" is called with BindingExpression 而不是更新值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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