ডাব্লুপিএফ তালিকাভিউ: ইভেন্টটিতে একটি ডাবল-ক্লিক সংযুক্ত করা হচ্ছে


85

আমার নিম্নলিখিতগুলি রয়েছে ListView:

<ListView Name="TrackListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Title" Width="100" 
                            HeaderTemplate="{StaticResource BlueHeader}" 
                            DisplayMemberBinding="{Binding Name}"/>

            <GridViewColumn Header="Artist" Width="100"  
                            HeaderTemplate="{StaticResource BlueHeader}"  
                            DisplayMemberBinding="{Binding Album.Artist.Name}" />
        </GridView>
    </ListView.View>
</ListView>

আমি কীভাবে প্রতিটি বাউন্ড আইটেমের সাথে এমন একটি ইভেন্ট সংযুক্ত করতে পারি যা আইটেমটিতে ডাবল-ক্লিক করার ফলে আগুন লাগবে?

উত্তর:


102

এখান থেকে সমাধানটি খুঁজে পেয়েছেন: http://social.msdn.microsoft.com/ Forums / en-US / wpf / thread / 3d0eaa54-09a9-4c51-8677-8e90577e7bac/


এক্সএএমএল:

<UserControl.Resources>
    <Style x:Key="itemstyle" TargetType="{x:Type ListViewItem}">
        <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" />
    </Style>
</UserControl.Resources>

<ListView Name="TrackListView" ItemContainerStyle="{StaticResource itemstyle}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Title" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Artist" Width="100" HeaderTemplate="{StaticResource BlueHeader}" DisplayMemberBinding="{Binding Album.Artist.Name}" />
        </GridView>
    </ListView.View>
</ListView>

সি #:

protected void HandleDoubleClick(object sender, MouseButtonEventArgs e)
{
    var track = ((ListViewItem) sender).Content as Track; //Casting back to the binded Track
}

14
আপনার যদি স্টাইলটি পুনরায় ব্যবহার করার প্রয়োজন না হয় তবে আপনি এটিকে সরাসরি <লিস্টভিউ.সংশ্লিষ্ট /> বিভাগে রেখে x: কী সরাতে পারেন।
ডেভিড স্মিট

8
এটি আমার পক্ষেও কাজ করেছিল। ধন্যবাদ! বিটিডাব্লু, আপনি সম্ভবত হ্যান্ডলারের মধ্যে ডাবলক্লিক ইভেন্টের বুদবুদটি সেট করে এটি বন্ধ করতে চাইবেন: e.Handled = true;
টম এ

4
আমার এ নিয়ে সমস্যা আছে। এটি হ'ল, আমি উইন্ডোতে কাস্টম নিয়ন্ত্রণে ব্যবহৃত উইন্ডোতে থাকা তালিকাভিউগুলি সহ সমস্ত UI উপাদানগুলিকে স্টাইল করতে এক্স: কী-কম স্টাইলগুলি ব্যবহার করি। কাস্টম নিয়ন্ত্রণের এক্সএএমএল-এ এই ইভেন্ট-হ্যান্ডলারটি স্থাপন করা উইন্ডোতে প্রয়োগ করা স্টাইলটি অক্ষম করে।
জেনো সিছুপুর 16

8
কৌতূহলের বাইরে, এমভিভিএম লঙ্ঘন করে না এমন করার আরও কি উপায় আছে?
ডেভ

13
একটি সতর্কতা হিসাবে: একটি EventSetterহ্যান্ডলারের লক্ষ্য যদি এর চেয়ে বেশি সময় বেঁচে থাকে তবে এটিকে ব্যবহার করলে স্মৃতি ফাঁস হতে পারে ListViewItem। আমি গত কয়েক দিন (একটি সময়ে 20MB) একটি গুরুতর মেমরি লিক ডিবাগ, শুধুমাত্র খুঁজে বের করতে যে ব্যয় ListViewItems এবং তাদের যুক্ত মেমরির একটি মাধ্যমে ফাঁস হচ্ছে EventSetter
জ্যাচ জনসন

73

কোনও মেমরি ফাঁস নয় (প্রতিটি আইটেম সাবস্ক্রাইব করার দরকার নেই) , দুর্দান্ত কাজ করে:

এক্সএএমএল:

<ListView MouseDoubleClick="ListView_MouseDoubleClick" ItemsSource="{Binding TrackCollection}" />

সি #:

    void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var item = ((FrameworkElement) e.OriginalSource).DataContext as Track;
        if (item != null)
        {
            MessageBox.Show("Item's Double Click handled!");
        }
    }

4
দুর্দান্ত, মেমরি ফাঁস সম্পর্কে আর চিন্তা করার দরকার নেই, এবং সত্যি বলতে এটি কেবল অনেক ক্লিনার এর একটি নরক।
ean5533

4
আপনার তালিকায় যদি কোনও জটিল অবজেক্ট থাকে তবে এটি যথেষ্ট নয়। পিতামাতাদের
তালিকাভিউ আইটেমটি

4
পরিষ্কার এবং সহজ। ধন্যবাদ
শাশ্বত 21

4
খুব সুন্দর এবং সহায়ক। আমার ক্ষেত্রে আমার কাছে অতিরিক্ত বাছাই বোতাম রয়েছে যা নির্বাচনটি অ্যাকশন করে। সুতরাং আমি ডাবল ক্লিকটি নিম্নরূপে ব্যবহার করেছি: 'মাউসডুবলক্লিক = "সিলেক্ট বিটিএন_ক্লিক"' 'বেসরকারী শূন্য নির্বাচন করুন বিটিএন_ক্লিক (অবজেক্ট প্রেরক, রাউটেডভেন্টস ই) {}'
কিশোর

4
এ কারণেই আপনি সর্বদা গৃহীত উত্তরটি স্ক্রোল করুন।
সেক্ষেত্রে

7

আমার সমাধানটি @ epox_sub এর উত্তরের উপর ভিত্তি করে তৈরি হয়েছিল যা আপনাকে এক্সএএমএল-এ ইভেন্ট হ্যান্ডলারটি কোথায় রাখা উচিত তা লক্ষ্য করা উচিত। কোড-পিছনে আমার ListViewItemsপক্ষে কাজ হয়নি কারণ আমার জটিল বস্তু। @ সিপুইজের উত্তরটি কোথায় দেখতে হবে তার দুর্দান্ত ইঙ্গিত ছিল ...

void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var item = ListView.SelectedItem as Track;
    if (item != null)
    {
      MessageBox.Show(item + " Double Click handled!");
    }
}

SelectedItemএটির সাথে বোনাসটি হ'ল আপনি এর ডেটা কনটেক্সট বাইন্ডিং পান ( Trackএই ক্ষেত্রে)। নির্বাচিত আইটেমটি কাজ করে কারণ ডাবল ক্লিকের প্রথম ক্লিকটি এটি নির্বাচন করে।


4

যারা বেশিরভাগ এমভিভিএম প্যাটার্ন বজায় রাখতে আগ্রহী তাদের জন্য আমি অ্যান্ড্রেয়াস গ্রেচের উত্তরটি প্রায়শই তৈরি করতে ব্যবহার করেছি ।

প্রাথমিক প্রবাহ:

ব্যবহারকারী ডাবল-ক্লিক আইটেম -> পিছনে কোড ইভেন্ট হ্যান্ডলার -> আইকোমন্ড ভিউ মডেল

প্রজেক্টভিউ.এক্সএএমএল:

<UserControl.Resources>
    <Style TargetType="ListViewItem" x:Key="listViewDoubleClick">
        <EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/>
    </Style>
</UserControl.Resources>

...

<ListView ItemsSource="{Binding Projects}" 
          ItemContainerStyle="{StaticResource listViewDoubleClick}"/>

প্রজেক্টভিউ.অ্যাক্সমল সি:

public partial class ProjectView : UserControl
{
    public ProjectView()
    {
        InitializeComponent();
    }

    private void ListViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        ((ProjectViewModel)DataContext)
            .ProjectClick.Execute(((ListViewItem)sender).Content);
    }
}

প্রোজেক্টভিউমোডেল সি:

public class ProjectViewModel
{
    public ObservableCollection<Project> Projects { get; set; } = 
               new ObservableCollection<Project>();

    public ProjectViewModel()
    {
        //Add items to Projects
    }

    public ICommand ProjectClick
    {
        get { return new DelegateCommand(new Action<object>(OpenProjectInfo)); }
    }

    private void OpenProjectInfo(object _project)
    {
        ProjectDetailView project = new ProjectDetailView((Project)_project);
        project.ShowDialog();
    }
}

ডেলিগেটকম্যান্ড.সি এখানে পাওয়া যাবে

আমার উদাহরণস্বরূপ, আমি একটি সংগ্রহে আছে Projectযে বস্তু পূরণ ListView। এই বিষয়বস্তুগুলির তালিকায় প্রদর্শিত দেখানোর চেয়ে আরও বেশি বৈশিষ্ট্য রয়েছে এবং আমি এগুলি প্রদর্শন করার জন্য একটি ProjectDetailView(একটি ডাব্লুপিএফ Window) খুলি ।

senderইভেন্ট হ্যান্ডলার বস্তুর নির্বাচন করা হয় ListViewItem। পরবর্তীকালে, Projectআমি যেটিতে অ্যাক্সেস চাই তা Contentসম্পত্তির মধ্যে অন্তর্ভুক্ত ।


3

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

<ListView Name="TrackListView" SelectionChanged="MySelectionChanged">

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


আমি সীমানা আইটেমগুলিতে একটি ইভেন্ট চেয়েছিলাম, শিরোনামগুলি নয়
আন্দ্রে গ্র্যাচ

এটি আমার জন্য নতুন one আপনার উত্তর দেওয়ার জন্য ধন্যবাদ (এবং আমি আমার থেকে কোনও ডাবলিক্লিক ইভেন্টের বিবৃতি অপসারণ করব)।
অ্যারন ক্লসন

3

বিকল্প যেটি আমি ব্যবহার করেছি তা হ'ল ইভেন্ট টু কমান্ড,

<ListView ItemsSource="{Binding SelectedTrack}" SelectedItem="{Binding SelectedTrack}" >
    <i:Interaction.Triggers>
         <i:EventTrigger EventName="MouseDoubleClick">
              <i:InvokeCommandAction Command="{Binding SelectTrackCommand}"/>
         </i:EventTrigger>
    </i:Interaction.Triggers>
    ...........
    ...........
</ListView>

1

Epox_spb এর উত্তরে বিল্ডিং, গ্রিডভিউ কলাম শিরোনামগুলিতে ডাবল ক্লিক করার সময় ত্রুটিগুলি এড়াতে আমি একটি চেক যুক্ত করেছি।

void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var dataContext = ((FrameworkElement)e.OriginalSource).DataContext;
    if (dataContext is Track)
    {
        MessageBox.Show("Item's Double Click handled!");
    }
}

খুব দুর্দান্ত - পাওয়ারশেল- - এর সাথে কাজ করে $myListView.Add_MouseDoubleClick({ Param($sender, $ev); $e = [System.Windows.Input.MouseButtonEventArgs]$ev; $itemData = ([System.Windows.FrameworkElement]$e.OriginalSource).DataContext }); if ($item -ne $null) { Write-Host $itemData; } })--- কাস্টিংয়ের প্রয়োজন হয় না তবে সম্পূর্ণ হতে
আইএসইতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.