ডাব্লুপিএফ ত্রুটি: লক্ষ্য উপাদানটির জন্য পরিচালিত ফ্রেমওয়ার্কএলিমেন্ট খুঁজে পাওয়া যায় না


88

আমার কাছে একটি DataGridসারি রয়েছে যার একটি চিত্র রয়েছে। এই চিত্রটি একটি নির্দিষ্ট রাজ্যে ট্রিগার দিয়ে আবদ্ধ। যখন রাষ্ট্র পরিবর্তন হয় আমি চিত্রটি পরিবর্তন করতে চাই।

টেমপ্লেট নিজেই সেট করা হয় HeaderStyleএকটি এর DataGridTemplateColumn। এই টেমপ্লেটের কিছু বাইন্ডিং রয়েছে। প্রথম বাঁধাইকরণ দিনটি কী দিন তা দেখায় এবং রাজ্যটি ট্রিগার দিয়ে চিত্রটি পরিবর্তন করে।

এই বৈশিষ্ট্যগুলি একটি ভিউমোডেলে সেট করা আছে।

বৈশিষ্ট্য:

public class HeaderItem
{
    public string Day { get; set; }
    public ValidationStatus State { get; set; }
}

this.HeaderItems = new ObservableCollection<HeaderItem>();
for (int i = 1; i < 15; i++)
{
    this.HeaderItems.Add(new HeaderItem()
    {
        Day = i.ToString(),
        State = ValidationStatus.Nieuw,
    });
}

ডেটাগ্রিড:

<DataGrid x:Name="PersoneelsPrestatiesDataGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
              AutoGenerateColumns="False" SelectionMode="Single" ItemsSource="{Binding CaregiverPerformances}" FrozenColumnCount="1" >

    <DataGridTemplateColumn HeaderStyle="{StaticResource headerCenterAlignment}" Header="{Binding HeaderItems[1]}" Width="50">
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <TextBox Text="{ Binding Performances[1].Duration,Converter={StaticResource timeSpanConverter},Mode=TwoWay}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>

        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock TextAlignment="Center" Text="{ Binding Performances[1].Duration,Converter={StaticResource timeSpanConverter}}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn> 
</DataGrid>

ডেটাগ্রিড শিরোলেখ স্টাইলটিম্পলেট:

<Style x:Key="headerCenterAlignment" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="HorizontalContentAlignment" Value="Center"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>

                    <TextBlock Grid.Row="0" Text="{Binding Day}" />
                    <Image x:Name="imageValidation" Grid.Row="1" Width="16" Height="16" Source="{StaticResource imgBevestigd}" />
                </Grid>

                <ControlTemplate.Triggers>
                    <MultiDataTrigger >
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding State}" Value="Nieuw"/>                                 
                        </MultiDataTrigger.Conditions>
                        <Setter TargetName="imageValidation" Property="Source" Value="{StaticResource imgGeenStatus}"/>
                    </MultiDataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

এখন আমি যখন প্রকল্পটি শুরু করি তখন চিত্রগুলি প্রদর্শিত হয় না এবং আমি এই ত্রুটিটি পেয়েছি:

System.Windows.Data ত্রুটি: 2: লক্ষ্য উপাদানটির জন্য পরিচালিত ফ্রেমওয়ার্কএলমেন্ট বা ফ্রেমওয়ার্কসন্টেন্টমেন্ট খুঁজে পাওয়া যায় না। বাইন্ডিং এক্সপ্রেশন: পথ = শিরোলেখ [0]; ডেটা আইটেম = নাল; টার্গেট উপাদান হ'ল ডেটাগ্রিডটেম্পলেট কলম '(হ্যাশকোড = 26950454); লক্ষ্যযুক্ত সম্পত্তি হ'ল 'শিরোনাম' (টাইপ 'অবজেক্ট')

কেন এই ত্রুটি দেখাচ্ছে?


4
আমি উপরের উত্তর সমাধানটি পরীক্ষা করে দেখেছি, তবে এটি আমার ক্ষেত্রে কার্যকর হয় না। আমি যখন থিমাসলেভেস.কম.২০১১/০৩/২০১ । তে লিঙ্কে অন্য সমাধানে স্যুইচ করি । ধারণাটি হ'ল সমাধানের মতো, ফ্রেমওয়ার্কএলমেন্ট ব্যবহার না করে তারা অন্য শ্রেণি তৈরি করেছিল। তারপরে এটি আমার পক্ষে কাজ করে।
leo5th

অন্যদের জন্য এখানে ত্রুটি বার্তাটি অনুসন্ধান করে শেষ করা হয়েছে: অনুরূপ প্রশ্নের উত্তর আমাকে সমস্যাটি প্রায় সহজেই সমাধান করতে সহায়তা করেছে stackoverflow.com/a/18657986/4961688
টিম পোহলমান

উত্তর:


166

দুর্ভাগ্যক্রমে যে কোনও DataGridColumnহোস্ট করা নীচে গাছের DataGrid.Columnsঅংশ Visualনয় এবং তাই ডেটাগ্রিডের ডেটা প্রসঙ্গে যুক্ত নয় connected বাইন্ডিং যেমন তাদের ওয়েবসাইটের সাথে কাজ করে না তাই Visibilityবা Headerইত্যাদি (যদিও এই বৈশিষ্ট্য বৈধ নির্ভরতা সম্পত্তি!)।

এখন আপনি ভাবতে পারেন যে এটি কীভাবে সম্ভব? তাদের Bindingসম্পত্তি কি ডেটা প্রসঙ্গে আবদ্ধ হওয়ার কথা নয় ? ভাল এটি সহজ একটি হ্যাক। বাঁধাই আসলে কাজ করে না। এটি আসলে ডেটাগ্রিড ঘর যা এই বাঁধাই করা অবজেক্টটি অনুলিপি করে / ক্লোন করে এবং এটি নিজস্ব সামগ্রী প্রদর্শন করার জন্য ব্যবহার করে!

সুতরাং এখন আপনার সমস্যা সমাধানের দিকে ফিরে, আমি ধরে নিই যে HeaderItemsএটি DataContextআপনার পিতামাতার মতামতের হিসাবে সেট করা অবজেক্টের একটি সম্পত্তি । আমরা করতে পারেন সংযোগ DataContextকোন দৃষ্টিকোণ DataGridColumnকিছু আমরা একটি কলের মাধ্যমে ProxyElement

নীচের উদাহরণে যেমন একটি লজিক্যাল শিশু সংযোগ কিভাবে প্রকাশ করে ContextMenuবা DataGridColumnপিতা বা মাতা দেখুন এরDataContext

 <Window x:Class="WpfApplicationMultiThreading.Window5"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
         xmlns:vb="http://schemas.microsoft.com/wpf/2008/toolkit"
         Title="Window5" Height="300" Width="300" >
  <Grid x:Name="MyGrid">
    <Grid.Resources>
        <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/>
    </Grid.Resources>
    <Grid.DataContext>
         <TextBlock Text="Text Column Header" Tag="Tag Columne Header"/>
    </Grid.DataContext>
    <ContentControl Visibility="Collapsed"
             Content="{StaticResource ProxyElement}"/>
    <vb:DataGrid AutoGenerateColumns="False" x:Name="MyDataGrid">
        <vb:DataGrid.ItemsSource>
            <x:Array Type="{x:Type TextBlock}">
                <TextBlock Text="1" Tag="1.1"/>
                <TextBlock Text="2" Tag="1.2"/>
                <TextBlock Text="3" Tag="2.1"/>
                <TextBlock Text="4" Tag="2.2"/>
            </x:Array>
        </vb:DataGrid.ItemsSource>
        <vb:DataGrid.Columns>
            <vb:DataGridTextColumn
                       Header="{Binding DataContext.Text,
                                     Source={StaticResource ProxyElement}}"
                       Binding="{Binding Text}"/>
            <vb:DataGridTextColumn
                       Header="{Binding DataContext.Tag,
                                     Source={StaticResource ProxyElement}}"
                       Binding="{Binding Tag}"/>
        </vb:DataGrid.Columns>
    </vb:DataGrid>
  </Grid>
</Window>

উপরের ভিউটিতে একই বাধ্যতামূলক ত্রুটির মুখোমুখি হয়েছে যা আপনি খুঁজে পেয়েছেন যদি আমি প্রক্সিলেট হ্যাক প্রয়োগ না করে থাকি। ProxyElement কোনো FrameworkElement যে হাসিল করে নেয়DataContext মূল দেখুন ও যৌক্তিক সন্তানকে এটা যেমন Offers থেকে ContextMenuবা DataGridColumn। তার জন্য এটি অবশ্যই Contentঅদৃশ্য হিসাবে হোস্ট করা আবশ্যক ContentControlযা একই দৃশ্যের অধীনে।

আমি আশা করি এটি আপনাকে সঠিক পথে পরিচালিত করবে।


26
আমি এই হ্যাকি প্রক্সি স্টাফগুলি সত্যই নিরাশকারী ব্যবহার করতে পেরেছি তবে একই কার্যকারিতা অর্জনের জন্য আমি অন্য কোনও উপায় খুঁজে পাচ্ছি না ... ধন্যবাদ আপনাকে।
অ্যালেক্স হোপ ও'কনোর

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

4
নাহ। উপরের সমাধানটি নেট নেট ৩.৫ এর জন্য খুব ভাল ফিট করে।
ডাব্লুপিএফ-এটি

4
এই উত্তরটি পুরানো, তবে। নেট 4.0 এর বিপরীতে এখনও কার্যকর useful কলামে ডেটা কনটেক্সট অনুলিপি জড়িত প্রায় প্রচুর উত্তর কাজ করে বলে মনে হচ্ছে না। আমার ভিউ মডেলের বৈশিষ্ট্যের উপর নির্ভর করে একটি কলাম দেখানো / আড়াল করা দরকার এবং এই সমাধানটি ভাল কাজ করেছে। এবং কোনও কোডের পিছনে কোড কোড পর্যালোচনায় একটি কূটনৈতিক ঘটনা ঘটায় না।
জেমস_উকে_দেব

4
এফওয়াইআই কনটেক্সট মেনু একই নয় এবং এর চারপাশে একটি অ-প্রক্সি কাজ রয়েছে। প্রসঙ্গ মেনুতে একটি উন্মুক্ত সম্পত্তি রয়েছে Parentযেখানে DataGridTextColumnএর DataGridOwnerসম্পত্তিটি প্রকাশ করে না । আমার উত্তরটিতে
প্রাসঙ্গিক

8

StaticResourceগ্রহণযোগ্য উত্তরের মতো ব্যবহার করার সামান্য সংক্ষিপ্ত বিকল্প হ'ল x:Reference:

<StackPanel>

    <!--Set the DataContext here if you do not want to inherit the parent one-->
    <FrameworkElement x:Name="ProxyElement" Visibility="Collapsed"/>

    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn
                Header="{Binding DataContext.Whatever, Source={x:Reference ProxyElement}}"
                Binding="{Binding ...}" />
        </DataGrid.Columns>
    </DataGrid>

</StackPanel>

এই প্রধান সুবিধা হল: যদি আপনি ইতিমধ্যে একটি উপাদান যা আছে না একটি DataGrid এর পূর্বপুরুষ (অর্থাত নাStackPanel উপরোক্ত উদাহরণের), আপনি শুধু এটা একটি নাম দিন এবং এটি ব্যবহার করতে পারেন x:Referenceপরিবর্তে, অত: পর কোন ডামি সংজ্ঞায়িত করতে প্রয়োজন না FrameworkElementমোটেই

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.