ডাব্লুপিএফ বাইন্ডিং ব্যবহার করে দুটি কমান্ড প্যারামিটার পাস করা


155

আমার একটি কমান্ড রয়েছে যা আমি আমার এক্সএএমএল ফাইল থেকে নিম্নলিখিত মানক সিনট্যাক্স ব্যবহার করে সম্পাদন করছি:

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/>

ব্যবহারকারীরা যেভাবে প্রত্যাশা করে (ক্যানভাসের প্রস্থ এবং উচ্চতা স্পষ্টতই) এটি সম্পন্ন করার জন্য আমার দৃষ্টিভঙ্গি থেকে দুই টুকরো তথ্যের টুকরোগুলি দরকার হওয়া অবধি আমি এটি কার্যকরভাবে কাজ করেছি।

মনে হচ্ছে এটি আমার কমান্ডের পক্ষে একটি আর্গুমেন্ট হিসাবে অ্যারে পাস করা সম্ভব তবে কমান্ডপ্যারামিটারে আমার দুটি ক্যানভাস বৈশিষ্ট্যের সাথে বাইন্ডিং নির্দিষ্ট করার কোনও উপায় দেখছি না:

<Button Content="Zoom" 
        Command="{Binding MyViewModel.ZoomCommand" 
        CommandParameter="{Binding ElementName=MyCanvas, Path=Width}"/>

আমি কীভাবে আমার আদেশে প্রস্থ এবং উচ্চতা উভয়কেই পার করব? এক্সএএমএল থেকে প্রাপ্ত আদেশগুলি ব্যবহার করা সম্ভব বলে মনে হচ্ছে না এবং আমার জুম পদ্ধতিতে এই তথ্যটি পৌঁছে দেওয়ার জন্য আমার কোডবিহাইডে একটি ক্লিক হ্যান্ডলারের ওয়্যার আপ করতে হবে।


[ উপরের সমাধান stackoverflow.com/questions/58114752/… । আমার একই সমস্যা ছিল))
ব্যবহারকারীর 1482689

উত্তর:


240

প্রথমত, আপনি যদি এমভিভিএম করছেন আপনি সাধারণত ভিউ থেকে আবদ্ধ পৃথক বৈশিষ্ট্যগুলির মাধ্যমে আপনার ভিএম এর কাছে এই তথ্যটি পাবেন। এটি আপনাকে আপনার কমান্ডগুলিতে কোনও পরামিতি পাস করতে বাঁচায়।

তবে, পরামিতিগুলি তৈরি করতে আপনি একাধিক বাঁধাই এবং একটি রূপান্তরকারী ব্যবহার করতে পারেন:

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand">
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource YourConverter}">
             <Binding Path="Width" ElementName="MyCanvas"/>
             <Binding Path="Height" ElementName="MyCanvas"/>
        </MultiBinding>
    </Button.CommandParameter>
</Button>

আপনার রূপান্তরকারী:

public class YourConverter : IMultiValueConverter
{
    public object Convert(object[] values, ...)
    {
        return values.Clone();
    }

    ...
}

তারপরে, আপনার কমান্ড কার্যকর করার যুক্তি:

public void OnExecute(object parameter)
{
    var values = (object[])parameter;
    var width = (double)values[0];
    var height = (double)values[1];
}

1
থ্যাঙ্কস কেন্ট - আমি ঠিক তাই খুঁজছিলাম আমি আপনার প্রথম পদ্ধতির আরও ভাল পছন্দ করি যাতে ভিএম আমার কাছে কোনও পরামিতি পাস না করে বাঁধার মাধ্যমে দর্শনটির "রাজ্য" জানে তবে আমি এখনও এটি পরীক্ষা করতে পারি। আমি নিশ্চিত নই যে এটি আমার জন্য এখানে কাজ করে চলেছে, যেহেতু ক্যানভাসকে যতটা সম্ভব বড় করা এবং এই মানটি ভিএমকে দেওয়ার জন্য আমার দৃষ্টিভঙ্গি দরকার। যদি আমি এটি বেঁধে রাখি তবে আমাকে কি ভিএম-তে প্রস্থ স্থাপন করতে হবে না? কোন ক্ষেত্রে, ভিএম ভিউ করতে বাধ্য?
জেসনডি

@ জেসন: আপনি যেভাবেই এটি করতে পারেন। অর্থাত, ভিউ পুশটি ভিউ মডেলটিতে ফিরে আসুন, বা ভিউ মডেলের ভিউতে পুশ পরিবর্তনগুলি রয়েছে। একটি টুওয়ে বাঁধাইয়ের ফলে উভয় বিকল্প আপনার কাছে উপলব্ধ হয়ে উঠবে।
কেন্ট বুগার্ট

আমার প্রোগ্রামে অনেক্সট পদ্ধতি প্যারামিটারটি নাল মান সহ একটি অ্যারে তবে রূপান্তরকারীতে মানগুলি প্রত্যাশা অনুযায়ী হয়
অ্যালেক্স ডেভিড

2
আমি দেখতে পেলাম যে পরামিতি অনেক্সট পদ্ধতিতে শূন্য, এছাড়াও আপনারকোনভার্টার.কেনভার্ট () বোতামটি ক্লিক করার পরে কল করা হয়নি। কেন?
সাবমেরিনএক্স

3
এটি কাজ করে না, যখন একটি বোতাম টিপে দেওয়া হয়, প্যারামিটারগুলি শূন্য হয়
adminSoftDK

38

নির্বাচিত সমাধানটির রূপান্তরকারীতে, আপনাকে মান যুক্ত করা উচিত Cক্লোন () অন্যথায় কমান্ডের প্যারামিটারগুলি নাল শেষ করে

public class YourConverter : IMultiValueConverter
{
    public object Convert(object[] values, ...)
    {
        return values.Clone();
    }

    ...
}

6
হাই, ক্লোন () এর সাথে এই সংযোজনটি এটি কার্যকর করে তোলে :) আপনি কি দয়া করে ব্যাখ্যা করতে পারেন, এটি কী পার্থক্য করে। বেকুয়েজ আমি বুঝতে পারি না কেন এটির জন্য ক্লোন () কাজ করা দরকার? ধন্যবাদ.
অ্যাডমিনসফ্টডিকে

আমি ভুল হতে পারি, তবে এটি (1267 লাইন) দেখে মনে হচ্ছে এটি আমার জন্য কারণ হতে পারে: রেফারেন্সসোর্স.মাইক্রোসফটকম
# সার্বজনীন ফ্রেমওয়ার্ক

14

কনভার্টারে টুপল ব্যবহার করুন এবং অনেক্সটেতে প্যারামিটার অবজেক্টটি টুপলে ফিরে যান।

public class YourConverter : IMultiValueConverter 
{      
    public object Convert(object[] values, ...)     
    {   
        Tuple<string, string> tuple = new Tuple<string, string>(
            (string)values[0], (string)values[1]);
        return (object)tuple;
    }      
} 

// ...

public void OnExecute(object parameter) 
{
    var param = (Tuple<string, string>) parameter;
}

5

যদি আপনার মানগুলি স্থিতিশীল হয় তবে আপনি এটি ব্যবহার করতে পারেন x:Array:

<Button Command="{Binding MyCommand}">10
  <Button.CommandParameter>
    <x:Array Type="system:Object">
       <system:String>Y</system:String>
       <system:Double>10</system:Double>
    </x:Array>
  </Button.CommandParameter>
</Button>

" যদি আপনার মানগুলি স্থির হয় ": স্থিতিশীল সংস্থান কী? উদাহরণস্বরূপ প্রশ্নে ক্যানভাস প্রস্থ এবং উচ্চতা উল্লেখ রয়েছে। এই মানগুলি ধ্রুবক নয়, তবে তারা কি স্থির? এক্ষেত্রে এক্সএএমএল কী হবে?
মিনিট

2
আমার "স্ট্যাটিক" এর পরিবর্তে "ধ্রুবক" লেখা উচিত ছিল। স্ট্যাটিক রিসোর্স এমন একটি রিসোর্স যা কার্যকর করার সময় পরিবর্তন হয় না। আপনি যদি SystemColorsউদাহরণস্বরূপ ব্যবহার করেন তবে এর DynamicResourceপরিবর্তে আপনার ব্যবহার করা উচিত StaticResourceকারণ ব্যবহারকারী কার্যকর করার সময় কন্ট্রোল প্যানেলের মাধ্যমে সিস্টেমের রঙ পরিবর্তন করতে পারে। ক্যানভাস Widthএবং Heightসম্পদ নয় এবং স্থির নয়। সেখান থেকে উত্তরাধিকারসূত্রে উদাহরণস্বরূপ সম্পত্তি FrameworkElement
ম্যাক্সেন্স

2

রূপান্তরকারীতে টুপল ব্যবহার সম্পর্কে, 'স্ট্রিং' এর পরিবর্তে 'অবজেক্ট' ব্যবহার করা ভাল হবে, যাতে এটি 'স্ট্রিং' অবজেক্টের সীমাবদ্ধতা ছাড়াই সমস্ত ধরণের অবজেক্টের জন্য কাজ করে।

public class YourConverter : IMultiValueConverter 
{      
    public object Convert(object[] values, ...)     
    {   
        Tuple<object, object> tuple = new Tuple<object, object>(values[0], values[1]);
        return tuple;
    }      
} 

তাহলে কমান্ডে মৃত্যুদন্ড কার্যকর করার যুক্তি এই রকম হতে পারে

public void OnExecute(object parameter) 
{
    var param = (Tuple<object, object>) parameter;

    // e.g. for two TextBox object
    var txtZip = (System.Windows.Controls.TextBox)param.Item1;
    var txtCity = (System.Windows.Controls.TextBox)param.Item2;
}

পরামিতিগুলি তৈরি করতে রূপান্তরকারী সহ একাধিক বাইন্ড (দুটি পাঠ্যবক্স অবজেক্ট সহ)

<Button Content="Zip/City paste" Command="{Binding PasteClick}" >
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource YourConvert}">
            <Binding ElementName="txtZip"/>
            <Binding ElementName="txtCity"/>
        </MultiBinding>
    </Button.CommandParameter>
</Button>

আমি এটি পছন্দ করি যেহেতু কনভার্টারটি কতগুলি প্যারামিটার সমর্থন করে তা আরও স্পষ্ট। মাত্র দুটি পরামিতি জন্য ভাল! (প্লাস আপনি সম্পূর্ণ কভারেজের জন্য এক্সএএমএল এবং কমান্ড কার্য সম্পাদন দেখিয়েছেন)
কালেব ডব্লিউ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.