.net ডাব্লুএফএফ-কমান্ড বাইন্ডিংয়ের সাহায্যে 'ক্যানেক্সুকুট' পুনরায় মূল্যায়ন করতে একটি কমান্ডকে কিভাবে জোর দেওয়া যায়




wpf command (5)

আমার একটি Menu যেখানে MenuItem প্রতিটি MenuItem এটির Command সম্পত্তির একটি RoutedCommand Command সেট আছে যা আমি সংজ্ঞায়িত করেছি। সংশ্লিষ্ট CanExecute এর মূল্যায়ন করার জন্য একটি কলব্যাক CanExecute যা প্রতিটি MenuItem সক্ষম অবস্থায় নিয়ন্ত্রণ করে।

এই প্রায় কাজ করে। মেনু আইটেমগুলি প্রাথমিকভাবে সঠিক সক্ষম এবং নিষ্ক্রিয় অবস্থায় আসে। তবে যখন আমার CanExecute কলব্যাকের ডেটা পরিবর্তনগুলি ব্যবহার করে তখন আমার এই নতুন অবস্থাটি UI এ প্রতিফলিত হওয়ার জন্য আমার কলব্যাকের একটি ফলাফল পুনঃ-অনুরোধ করার প্রয়োজন।

এই জন্য RoutedCommand বা CommandBinding কোনও পাবলিক পদ্ধতি প্রদর্শিত হবে না।

মনে রাখবেন যে যখন আমি কন্ট্রোলে ক্লিক বা টাইপ করি তখন কলব্যাকটি আবার ব্যবহার করা হয় (আমি মনে করি এটি ইনপুটতে ট্রিগার হয়েছে কারণ মাউস-ওভার রিফ্রেশ না করে)।


আমি কমান্ডগুলিতে সম্পত্তি নির্ভরতা পরিচালনা করার একটি সমাধান বাস্তবায়ন করেছি, এখানে লিঙ্কটি https://.com/a/30394333/1716620

ধন্যবাদ যে আপনি এই মত একটি কমান্ড আপ শেষ হবে:

this.SaveCommand = new MyDelegateCommand<MyViewModel>(this,
    //execute
    () => {
      Console.Write("EXECUTED");
    },
    //can execute
    () => {
      Console.Write("Checking Validity");
       return PropertyX!=null && PropertyY!=null && PropertyY.Length < 5;
    },
    //properties to watch
    (p) => new { p.PropertyX, p.PropertyY }
 );

আমি CommandManager.InvalidateRequerySuggested(); ব্যবহার করতে পারে না CommandManager.InvalidateRequerySuggested(); কারণ আমি পারফরম্যান্স আঘাত পেয়েছিলাম।

আমি এমভিভিএম হেল্পার Delegating কমান্ডটি ব্যবহার করেছি, যা নীচের মত দেখায় (আমি আমাদের req এর জন্য এটি একটি tweaked করেছি)। আপনি command.RaiseCanExecuteChanged() ভিএম থেকে কল করতে হবে

public event EventHandler CanExecuteChanged
{
    add
    {
        _internalCanExecuteChanged += value;
        CommandManager.RequerySuggested += value;
    }
    remove
    {
        _internalCanExecuteChanged -= value;
        CommandManager.RequerySuggested -= value;
    }
}

/// <summary>
/// This method can be used to raise the CanExecuteChanged handler.
/// This will force WPF to re-query the status of this command directly.
/// </summary>
public void RaiseCanExecuteChanged()
{
    if (canExecute != null)
        OnCanExecuteChanged();
}

/// <summary>
/// This method is used to walk the delegate chain and well WPF that
/// our command execution status has changed.
/// </summary>
protected virtual void OnCanExecuteChanged()
{
    EventHandler eCanExecuteChanged = _internalCanExecuteChanged;
    if (eCanExecuteChanged != null)
        eCanExecuteChanged(this, EventArgs.Empty);
}

ICommand প্রয়োগকারী আপনার নিজস্ব শ্রেণিটি ICommand আপনি প্রয়োজনীয় অনেকগুলি ম্যানুয়াল রিফ্রেশিংয়ের উপর নির্ভর করতে বাধ্য হওয়ার জন্য স্বয়ংক্রিয় স্থিতির অনেকগুলি আপডেট হারাতে পারেন। এটি InvalidateRequerySuggested() কেও ভাঙ্গতে পারে। সমস্যাটি হ'ল একটি সহজ ICommand বাস্তবায়ন কমান্ড ICommand নতুন কমান্ড লিঙ্ক করতে ব্যর্থ হয়েছে।

সমাধান নিম্নলিখিত ব্যবহার করা হয়:

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void RaiseCanExecuteChanged()
    {
        CommandManager.InvalidateRequerySuggested();
    }

এইভাবে গ্রাহক আপনার ক্লাসের পরিবর্তে CommandManager সাথে সংযুক্ত হন এবং কমান্ড স্ট্যাটাস পরিবর্তনগুলিতে যথাযথভাবে অংশগ্রহণ করতে পারেন।


বইয়ের মধ্যে সবচেয়ে সুন্দর নয়, তবে আপনি কমান্ড মেনজারটি সব কমান্ড বাইন্ডিং অবৈধ করতে ব্যবহার করতে পারেন:

CommandManager.InvalidateRequerySuggested();

MSDN আরও তথ্য দেখুন


এটি আমার জন্য কাজ করেছে: XAML এ কমান্ডের আগে CanExecute রাখুন।





commandbinding