এমভিভিএম ব্যবহার করে ডাব্লুপিএফ তালিকাভিউ আইটেম থেকে ডাবল ক্লিক ইভেন্ট ফায়ার করা


102

এমভিভিএম ব্যবহার করে একটি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে, আমার কাছে তালিকার আইটেম সহ একটি ব্যবহারকারী নিয়ন্ত্রণ রয়েছে। চলমান সময়ে, এটি অবজেক্টের সংকলন সহ তালিকা ভিউ পূরণের জন্য ডেটাবাইন্ডিং ব্যবহার করবে।

তালিকার ভিউটিতে আইটেমগুলিতে ডাবল ক্লিক ইভেন্ট সংযুক্ত করার সঠিক উপায়টি কী কী যাতে তালিকার ভিউটিতে কোনও আইটেমটি দ্বিগুণ ক্লিক করা হয়, তখন ভিউ মডেলের কোনও আনুষাঙ্গিক ঘটনা বরখাস্ত করা হয় এবং ক্লিক করা আইটেমটির একটি রেফারেন্স থাকে?

এটি কীভাবে পরিষ্কার এমভিভিএম উপায়ে করা যায় অর্থাৎ ভিউয়ের পিছনে কোনও কোড নেই?

উত্তর:


76

দয়া করে, পিছনের কোডটি মোটেই খারাপ জিনিস নয়। দুর্ভাগ্যক্রমে, ডাব্লুপিএফ সম্প্রদায়ের বেশিরভাগ লোকেরা এই ভুল পেয়েছে।

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

আমি পর্যাপ্ত পরিস্থিতি জানি যেখানে আপনাকে পিছনে কোডটি লিখতে হবে কারণ ডেটা বাইন্ডিং সবকিছুর সমাধান নয়। আপনার দৃশ্যে আমি ফাইলের পিছনের কোডে ডাবলক্লিক ইভেন্টটি পরিচালনা করব এবং এই কলটি ভিউমোডেলটিতে অর্পণ করব।

নমুনা অ্যাপ্লিকেশনগুলি যা পিছনে কোড ব্যবহার করে এবং এখনও এমভিভিএম বিচ্ছেদ পূরণ করে তা এখানে পাওয়া যাবে:

ডাব্লুপিএফ অ্যাপ্লিকেশন ফ্রেমওয়ার্ক (ডাব্লুএফএফ) - http://waf.codeplex.com


5
ঠিক আছে, আমি ডাবল ক্লিক করতে সমস্ত কোড এবং একটি অতিরিক্ত ডিএলএল ব্যবহার করতে অস্বীকার করেছি!
এডুয়ার্ডো মোল্টেনি

4
এটি কেবল বাঁধাইয়ের জিনিসটি ব্যবহার করে আমাকে আসল মাথা ব্যথা করে। এটি 1 টি বাহুতে, 1 টি চোখের প্যাচে 1 টি চোখ রেখে এবং 1 পায়ে দাঁড়ানোর জন্য জিজ্ঞাসা করার মতো। ডাবল ক্লিক সহজ হওয়া উচিত, এবং এই অতিরিক্ত কোডটি কীভাবে মূল্যবান তা আমি দেখতে পাচ্ছি না।
এচিবান

1
আমি ভীত আমি সম্পূর্ণরূপে আপনার সাথে একমত না। আপনি যদি বলেন যে 'পেছনের কোডটি খারাপ নয়', তবে আমার সে সম্পর্কে একটি প্রশ্ন রয়েছে: আমরা বাটনটির জন্য ক্লিক ইভেন্টটি প্রতিনিধিত্ব করি না তবে প্রায়শই এর পরিবর্তে বাইন্ডিং (কমান্ড সম্পত্তি ব্যবহার করে) ব্যবহার করি না কেন?
নম জি ভিইউ

21
@ নাম জি ভি ভি: ডাব্লুপিএফ নিয়ন্ত্রণ দ্বারা সমর্থিত হলে আমি সর্বদা কমান্ড বাইন্ডিং পছন্দ করি। কমান্ড বাইন্ডিং ভিউমোডেলটিতে (উদাহরণস্বরূপ CanExecute) 'ক্লিক' ইভেন্টটি রিলে করার চেয়ে আরও কিছু করে। তবে কমান্ডগুলি কেবলমাত্র সর্বাধিক সাধারণ দৃশ্যের জন্য উপলব্ধ। অন্যান্য পরিস্থিতিতে আমরা কোড-পেছনের ফাইলটি ব্যবহার করতে পারি এবং সেখানে আমরা ভিউমোডেল বা মডেলকে নন-ইউআই সম্পর্কিত উদ্বেগগুলি অর্পণ করি।
jbe

2
এখন আমি আপনাকে আরও বুঝতে পারি! আপনার সাথে চমৎকার আলোচনা!
নাম জি ভিইউ

73

নেট .৪.৪ নিয়ে কাজ করতে আমি এটি সক্ষম হয়েছি। সোজা এগিয়ে দেখায় এবং প্রয়োজনের পিছনে কোনও তৃতীয় পক্ষ বা কোড নেই।

<ListView ItemsSource="{Binding Data}">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Margin="2">
                    <Grid.InputBindings>
                        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding ShowDetailCommand}"/>
                    </Grid.InputBindings>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <Image Source="..\images\48.png" Width="48" Height="48"/>
                    <TextBlock Grid.Row="1" Text="{Binding Name}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

2
পুরো অঞ্চলটির জন্য কাজ করছে বলে মনে হচ্ছে না, যেমন আমি এটি কোনও ডক প্যানেলে করি এবং এটি কেবল যেখানে ডক প্যানেলের মধ্যে কিছু রয়েছে (যেমন টেক্সটব্লক, চিত্র) কিন্তু ফাঁকা জায়গা নয় works
স্টিফেন ড্রু

3
ঠিক আছে - এই পুরাতন চেস্টনট আবার ... স্ট্যাকওভারফ্লো.com
স্টিফেন ড্রু

6
আমি আপনার মাথাটি আঁচড়ানোর চেষ্টা করছিলাম কেন এটি আপনার সকলের জন্য কাজ করছে এবং আমার জন্য নয়। আমি হঠাৎ বুঝতে পারি যে আইটেম টেমপ্লেটের প্রসঙ্গে ডেটা প্রসঙ্গটি আইটেম সোর্স থেকে বর্তমান আইটেম এবং মূল উইন্ডোর ভিউ মডেল নয়। সুতরাং আমি এটি ব্যবহার করে নিম্নলিখিতটি ব্যবহার করলাম <মাউসবাইন্ডিং মাউসঅ্যাকশন = "বামদল ক্লিক করুন" কমান্ড = "inding বাঁধাই পথ = ডেটা কনটেক্সট.এডিটব্যান্ডকমন্ড, রিলেটিভসোর্স = {রিলেটিভসোর্স পূর্বসূরী টাইপ = {এক্স: উইন্ডো টাইপ করুন}}}" /> আমার ক্ষেত্রে এডিটব্যান্ডকম্যান্ড পৃষ্ঠার ভিউ মডেলটিতে কমান্ডটি সীমাবদ্ধ সত্তায় নেই।
নাস্কেও

ন্যাসকেউতে আমার এমভিভিএম লাইটের সাথে সিক্রেট সসের প্রয়োজন ছিল, ডাবল ক্লিক করা তালিকার বাক্সে মডেল অবজেক্ট হিসাবে একটি কমান্ড প্যারামিটার পেয়েছিল এবং উইন্ডোর ডেটা প্রসঙ্গটি ভিউ মডেলটিতে সেট করা থাকে যা কমান্ডটি প্রকাশ করে: <মাউসবাইন্ডিং অঙ্গভঙ্গি = "বামদল ক্লিক করুন" "কমান্ড =" inding বাঁধাই পথ = ডেটা কনটেক্সট.অপেনস্পটশটকম্যান্ড, রিলেটিভসোর্স = {রিলেটিভসোর্স পূর্বপুরুষ টাইপ = {এক্স: টাইপ উইন্ডো Command}} "কমান্ডপ্যারামিটার =" {বাঁধাই} "/>
এমসি 5

InputBindings.NET 3.0 থেকে উপলব্ধ যেগুলি যুক্ত করতে চান এবং সিলভারলাইটে উপলভ্য নয়
মার্টিন

44

আমি সংযুক্ত কমান্ড আচরণ এবং কমান্ড ব্যবহার করতে চাই । সংযুক্ত কমান্ড আচরণকারীগুলির মারলন গ্রেচের খুব ভাল প্রয়োগ রয়েছে। এগুলি ব্যবহার করে আমরা এরপরে তালিকাভিউয়ের আইটেমকন্টেইনার স্টাইল সম্পত্তিটিতে একটি স্টাইল নির্ধারণ করতে পারি যা প্রতিটি তালিকাভিউ আইটেমের জন্য কমান্ড সেট করে।

এখানে আমরা মাউসডুবলক্লিক ইভেন্টে বহিস্কারের জন্য আদেশটি নির্ধারণ করেছি এবং কমান্ডপ্যারামিটারটি আমরা ক্লিক করা ডেটা অবজেক্ট হবে। আমি যে কমান্ডটি ব্যবহার করছি তা পেতে এখানে আমি ভিজ্যুয়াল ট্রি ভ্রমণ করছি তবে আপনি সহজেই অ্যাপ্লিকেশন প্রশস্ত কমান্ড তৈরি করতে পারেন।

<Style x:Key="Local_OpenEntityStyle"
       TargetType="{x:Type ListViewItem}">
    <Setter Property="acb:CommandBehavior.Event"
            Value="MouseDoubleClick" />
    <Setter Property="acb:CommandBehavior.Command"
            Value="{Binding ElementName=uiEntityListDisplay, Path=DataContext.OpenEntityCommand}" />
    <Setter Property="acb:CommandBehavior.CommandParameter"
            Value="{Binding}" />
</Style>

কমান্ডগুলির জন্য, আপনি হয় সরাসরি একটি আইকোমন্ড বাস্তবায়ন করতে পারেন , বা এমভিভিএম টুলকিট-এর মতো কিছু সাহায্যকারী ব্যবহার করতে পারেন ।


1
+1 ডাব্লুপিএফ (প্রিজম) এর জন্য সম্মিলিত অ্যাপ্লিকেশন গাইডেন্সের সাথে কাজ করার সময় এটি আমার পছন্দের সমাধান হিসাবে খুঁজে পেয়েছি।
ট্র্যাভিস হেসম্যান

1
আপনার কোড নমুনা উপরে উপরে নাম 'স্পিড:' কি?
নাম জি ভিইউ

@ নামগিভিউ acb:= সংযুক্ত কম্যান্ডবিহেভিয়ার । কোডটি উত্তরের প্রথম লিঙ্কে পাওয়া যাবে
রাচেল

আমি ঠিক সেটাই চেষ্টা করেছি এবং কমান্ডবিভাওয়্যারবাইন্ডিং লাইন 99 ক্লাস থেকে নাল পয়েন্টার ব্যতিক্রম পেয়েছি vari পরিবর্তনশীল "কৌশল" নাল ull কোনো সমস্যা?
এটওয়াস 77

13

আমি মিশ্রিত এসডিকে ইভেন্ট ট্রিগারগুলির সাথে এটি করার একটি খুব সহজ এবং পরিষ্কার উপায় খুঁজে পেয়েছি। এমভিভিএম পরিষ্কার করুন, পুনরায় ব্যবহারযোগ্য এবং কোনও কোডের পিছনে নেই।

আপনার সম্ভবত ইতিমধ্যে এরকম কিছু রয়েছে:

<Style x:Key="MyListStyle" TargetType="{x:Type ListViewItem}">

আপনি যদি ইতিমধ্যে একটি ব্যবহার না করেন তবে এখনই এই মতো তালিকাভিউ আইটেমের জন্য একটি কন্ট্রোলটেম্পলেট যুক্ত করুন:

<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <GridViewRowPresenter Content="{TemplateBinding Content}"
                            Columns="{TemplateBinding GridView.ColumnCollection}" />
    </ControlTemplate>
  </Setter.Value>
 </Setter>

গ্রিডভিউরউপ্রিসেন্টার একটি তালিকা সারির উপাদান তৈরি করে "ভিতরে" সমস্ত উপাদানগুলির ভিজ্যুয়াল রুট হবে। মাউসডুবলক্লিক রাউটেড ইভেন্টগুলি সন্ধান করতে এবং ইনভোককম্যান্ডের মাধ্যমে একটি কমান্ড কল করার জন্য আমরা এখানে একটি ট্রিগার সন্নিবেশ করতে পারি:

<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <GridViewRowPresenter Content="{TemplateBinding Content}"
                            Columns="{TemplateBinding GridView.ColumnCollection}">
        <i:Interaction.Triggers>
          <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
          </i:EventTrigger>
        </i:Interaction.Triggers>
      </GridViewRowPresenter>
    </ControlTemplate>
  </Setter.Value>
 </Setter>

আপনার যদি গ্রিডআরউপ্রেসেন্টার "উপরে" ভিজ্যুয়াল উপাদান রয়েছে (গ্রিড দিয়ে শুরু করা প্রবাদযুক্ত) আপনি সেখানে ট্রিগারটিও রাখতে পারেন।

দুর্ভাগ্যক্রমে মাউসডুবলক্লিক ইভেন্টগুলি প্রতিটি ভিজ্যুয়াল উপাদান থেকে তৈরি হয় না (সেগুলি নিয়ন্ত্রণগুলি থেকে হয়, তবে উদাহরণস্বরূপ ফ্রেমওয়ার্ক উপাদানগুলি থেকে নয়)। একটি কার্যপ্রচার হ'ল ইভেন্টট্রিজারের কাছ থেকে একটি ক্লাস নেওয়া এবং ক্লিকের মাউন্ট 2 সহ মাউসবাটনEventArgs সন্ধান করা This

class DoubleClickEventTrigger : EventTrigger
{
    protected override void OnEvent(EventArgs eventArgs)
    {
        var e = eventArgs as MouseButtonEventArgs;
        if (e == null)
        {
            return;
        }
        if (e.ClickCount == 2)
        {
            base.OnEvent(eventArgs);
        }
    }
}

এখন আমরা এটি লিখতে পারি ('h' হ'ল উপরের সহায়ক শ্রেণীর নামস্থান):

<Setter Property="Template">
  <Setter.Value>
    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <GridViewRowPresenter Content="{TemplateBinding Content}"
                            Columns="{TemplateBinding GridView.ColumnCollection}">
        <i:Interaction.Triggers>
          <h:DoubleClickEventTrigger EventName="MouseDown">
            <i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
          </h:DoubleClickEventTrigger>
        </i:Interaction.Triggers>
      </GridViewRowPresenter>
    </ControlTemplate>
  </Setter.Value>
 </Setter>

যেহেতু আমি জানতে পেরেছি যে আপনি ট্রিগারটিকে সরাসরি গ্রিডভিউরউপ্রসেন্টারে রেখে দিলে সমস্যা হতে পারে। কলমের মধ্যে ফাঁকা স্থানগুলি সম্ভবত মাউস ইভেন্টগুলি মোটেও গ্রহণ করে না (সম্ভবত একটি সারসংক্ষেপ প্রান্তিককরণের সাথে তাদের স্টাইল করা হবে)।
গুনটার

এই ক্ষেত্রে গ্রিডভিউরউপ্রিসেন্টারের চারপাশে একটি খালি গ্রিড স্থাপন করা এবং ট্রিগারটি সেখানে রাখা ভাল। এটি কাজ করে বলে মনে হচ্ছে।
গুনটার

1
মনে রাখবেন যে আপনি যদি এই জাতীয় টেমপ্লেটটি প্রতিস্থাপন করেন তবে তালিকার ভিউ আইটেমের জন্য আপনি ডিফল্ট স্টাইলটি হারাবেন। আমি যে অ্যাপ্লিকেশনটিতে কাজ করছি তার জন্য এটি কোনও বিষয় নয় কারণ এটি যেভাবেই ভারী কাস্টমাইজড স্টাইলিং ব্যবহার করছে।
গুটার

6

আমি বুঝতে পারি যে এই আলোচনাটি এক বছরের পুরনো, তবে। নেট 4 এর সাথে এই সমাধান সম্পর্কে কোনও চিন্তাভাবনা আছে কি? আমি পুরোপুরি একমত যে এমভিভিএমের পয়েন্টটি ফাইলের পিছনে থাকা কোনও কোড মুছে ফেলার নয়। আমি খুব দৃ strongly়ভাবে অনুভব করি যে কেবল কিছু জটিল কারণ, এর চেয়ে ভাল এটি নয়। কোডটির পিছনে আমি যা রেখেছি তা এখানে:

    private void ButtonClick(object sender, RoutedEventArgs e)
    {
        dynamic viewModel = DataContext;
        viewModel.ButtonClick(sender, e);
    }

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

4

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

<ListView x:Name="list" 
   Message.Attach="[Event MouseDoubleClick] = [Action ItemActivated(list.SelectedItem)]" >

আরও তথ্যের জন্য আপনি ক্যালিবার্নের ডকুমেন্টেশন এবং নমুনাগুলি পরীক্ষা করতে পারেন।


4

ভিউটি তৈরি হওয়ার সময় আমি কমান্ডটি লিঙ্ক করা আরও সহজ খুঁজছি:

var r = new MyView();
r.MouseDoubleClick += (s, ev) => ViewModel.MyCommand.Execute(null);
BindAndShow(r, ViewModel);

আমার ক্ষেত্রে এটি BindAndShowদেখতে (আপডেটকন্ট্রোলগুলি + অ্যাভালোনডক):

private void BindAndShow(DockableContent view, object viewModel)
{
    view.DataContext = ForView.Wrap(viewModel);
    view.ShowAsDocument(dockManager);
    view.Focus();
}

যদিও আপনার কাছে নতুন মতামত খোলার ক্ষেত্রে যে পদ্ধতি আছে সেটির সাথে পদ্ধতির কাজ করা উচিত।


আমার কাছে মনে হচ্ছে এটি কেবল এক্সএএমএল-তে কাজ করার চেষ্টা করার চেয়ে এটিই সহজ সমাধান।
মাস

1

আমি সমাধানটি রাশুই থেকে দেখেছি সাথে দেখেছি তবে আমি এখনও তালিকাগুলির আইটেমের যে অংশে কোনও পাঠ্য ছিল না - এমনটি পটভূমিকে স্বচ্ছ হিসাবে সেট করার পরেও আঘাত করতে পারিনি, তাই আমি বিভিন্ন টেম্পলেট ব্যবহার করে এটি সমাধান করেছি।

এই তালিকাটি যখন তালিকাভুক্ত আইটেমটি নির্বাচন করা হয়েছে এবং সক্রিয় রয়েছে তখন এর জন্য:

<ControlTemplate x:Key="SelectedActiveTemplate" TargetType="{x:Type ListViewItem}">
   <Border Background="LightBlue" HorizontalAlignment="Stretch">
   <!-- Bind the double click to a command in the parent view model -->
      <Border.InputBindings>
         <MouseBinding Gesture="LeftDoubleClick" 
                       Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ItemSelectedCommand}"
                       CommandParameter="{Binding}" />
      </Border.InputBindings>
      <TextBlock Text="{Binding TextToShow}" />
   </Border>
</ControlTemplate>

এই তালিকাটি যখন তালিকাভুক্ত আইটেমটি নির্বাচন করা হয়েছে এবং নিষ্ক্রিয় থাকে তখন জন্য:

<ControlTemplate x:Key="SelectedInactiveTemplate" TargetType="{x:Type ListViewItem}">
   <Border Background="Lavender" HorizontalAlignment="Stretch">
      <TextBlock Text="{Binding TextToShow}" />
   </Border>
</ControlTemplate>

এটি তালিকাভিউ আইটেমের জন্য ব্যবহৃত ডিফল্ট শৈলী:

<Style TargetType="{x:Type ListViewItem}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate>
            <Border HorizontalAlignment="Stretch">
               <TextBlock Text="{Binding TextToShow}" />
            </Border>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
   <Style.Triggers>
      <MultiTrigger>
         <MultiTrigger.Conditions>
            <Condition Property="IsSelected" Value="True" />
            <Condition Property="Selector.IsSelectionActive" Value="True" />
         </MultiTrigger.Conditions>
         <Setter Property="Template" Value="{StaticResource SelectedActiveTemplate}" />
      </MultiTrigger>
      <MultiTrigger>
         <MultiTrigger.Conditions>
            <Condition Property="IsSelected" Value="True" />
            <Condition Property="Selector.IsSelectionActive" Value="False" />
         </MultiTrigger.Conditions>
         <Setter Property="Template" Value="{StaticResource SelectedInactiveTemplate}" />
      </MultiTrigger>
   </Style.Triggers>
</Style>

আমি যা পছন্দ করি না তা টেক্সটব্লকের পুনরাবৃত্তি এবং এটির পাঠ্য বাধ্যতামূলক, আমি জানি না যে দ্বিতীয়টি কেবলমাত্র এক জায়গায় ঘোষণা করে ঘুরতে পারে।

আমি আশা করি এটা কারো সাহায্যে লাগবে!


এটি দুর্দান্ত সমাধান এবং আমি একটি অনুরূপ ব্যবহার করি তবে আপনার কেবলমাত্র একটি নিয়ন্ত্রণ টেম্পলেট প্রয়োজন। যদি কোনও ব্যবহারকারী একটিতে ডাবল ক্লিক করতে চলেছে তবে listviewitemতারা সম্ভবত এটি ইতিমধ্যে নির্বাচিত কিনা তা বিবেচনা করে না। হাইলাইট এফেক্টটিও listviewশৈলীর সাথে মেলে দেখার জন্য টুইঙ্ক করা দরকার বলে নোট করা জরুরী । আপ-ভোট দিয়েছে।
ডেভিড বেন্টলে 16

1

আমি ইন্টারঅ্যাক্টিভিটি লাইব্রেরি ব্যবহার করে নেট 4.7 ফ্রেমওয়ার্কের সাহায্যে এই কার্যকারিতাটি তৈরি করতে সফল হয়েছি, প্রথমে XAML ফাইলে নাম স্থানটি ঘোষণা করার বিষয়ে নিশ্চিত হয়ে নিন

xmlns: আমি = "http://schemas.microsoft.com/expression/2010/interactivity"

তারপরে নীচের মতো তালিকাভিউয়ের অভ্যন্তরে স্ব স্ব ইনভোককম্যান্ডঅ্যাকশন সহ ইভেন্ট ট্রিগারটি সেট করুন।

দেখুন:

<ListView x:Name="lv" IsSynchronizedWithCurrentItem="True" 
          ItemsSource="{Binding Path=AppsSource}"  >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction CommandParameter="{Binding ElementName=lv, Path=SelectedItem}"
                                   Command="{Binding OnOpenLinkCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Developed By" DisplayMemberBinding="{Binding DevelopedBy}" />
        </GridView>
    </ListView.View>
</ListView>

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

মডেল:

public class ApplicationModel
{
    public string Name { get; set; }

    public string DevelopedBy { get; set; }
}

মডেল দেখুন:

public class AppListVM : BaseVM
{
        public AppListVM()
        {
            _onOpenLinkCommand = new DelegateCommand(OnOpenLink);
            _appsSource = new ObservableCollection<ApplicationModel>();
            _appsSource.Add(new ApplicationModel("TEST", "Luis"));
            _appsSource.Add(new ApplicationModel("PROD", "Laurent"));
        }

        private ObservableCollection<ApplicationModel> _appsSource = null;

        public ObservableCollection<ApplicationModel> AppsSource
        {
            get => _appsSource;
            set => SetProperty(ref _appsSource, value, nameof(AppsSource));
        }

        private readonly DelegateCommand _onOpenLinkCommand = null;

        public ICommand OnOpenLinkCommand => _onOpenLinkCommand;

        private void OnOpenLink(object commandParameter)
        {
            ApplicationModel app = commandParameter as ApplicationModel;

            if (app != null)
            {
                //Your code here
            }
        }
}

আপনার ক্ষেত্রে ডেলিগেটকম্যান্ড ক্লাসের বাস্তবায়ন প্রয়োজন ।


0

এখানে একটি আচরণ উভয় সম্পন্ন পায় ListBoxএবং ListView

public class ItemDoubleClickBehavior : Behavior<ListBox>
{
    #region Properties
    MouseButtonEventHandler Handler;
    #endregion

    #region Methods

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.PreviewMouseDoubleClick += Handler = (s, e) =>
        {
            e.Handled = true;
            if (!(e.OriginalSource is DependencyObject source)) return;

            ListBoxItem sourceItem = source is ListBoxItem ? (ListBoxItem)source : 
                source.FindParent<ListBoxItem>();

            if (sourceItem == null) return;

            foreach (var binding in AssociatedObject.InputBindings.OfType<MouseBinding>())
            {
                if (binding.MouseAction != MouseAction.LeftDoubleClick) continue;

                ICommand command = binding.Command;
                object parameter = binding.CommandParameter;

                if (command.CanExecute(parameter))
                    command.Execute(parameter);
            }
        };
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewMouseDoubleClick -= Handler;
    }

    #endregion
}

এখানে পিতামাতার সন্ধানের জন্য ব্যবহৃত এক্সটেনশন ক্লাস।

public static class UIHelper
{
    public static T FindParent<T>(this DependencyObject child, bool debug = false) where T : DependencyObject
    {
        DependencyObject parentObject = VisualTreeHelper.GetParent(child);

        //we've reached the end of the tree
        if (parentObject == null) return null;

        //check if the parent matches the type we're looking for
        if (parentObject is T parent)
            return parent;
        else
            return FindParent<T>(parentObject);
    }
}

ব্যবহার:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:coreBehaviors="{{Your Behavior Namespace}}"


<ListView AllowDrop="True" ItemsSource="{Binding Data}">
    <i:Interaction.Behaviors>
       <coreBehaviors:ItemDoubleClickBehavior/>
    </i:Interaction.Behaviors>

    <ListBox.InputBindings>
       <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding YourCommand}"/>
    </ListBox.InputBindings>
</ListView>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.