سؤال

ولدي تحكم المستخدم مع ListView تحتوي على مواد بسيطة من ObservableCollection. وأود أن ContextMenu من أن ListView إلى احتواء العناصر اعتمادا على ما المحدد في ListView. إذا لم يتم تحديد البند، يجب أن بعض MenuItems لا تكون مرئية.

وبلدي تحويل لا يسمى حتى عندما فتح ContextMenu. يبدو الربط أن أكون مخطئا، وأجد هذا في إطار الإخراج:

<اقتباس فقرة>   

وSystem.Windows.Data خطأ: 4: لا يمكن البحث عن مصدر للربط مع الإشارة 'ElementName = listView. BindingExpression: مسار = SelectedItem. DataItem = فارغة؛ العنصر الهدف هو 'MENUITEM "(اسم =' ')؛ استهداف الممتلكات هو 'الرؤية' (نوع 'الرؤية')

وأنا لا أفهم ما هو الخطأ، ولا يمكن معرفة ذلك من خلال البحث في شبكة الإنترنت.

وهنا بعض التعليمات البرمجية مبسط:

<UserControl x:Class="MyApp.DatabaseControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:MyApp"
Height="Auto" 
Width="Auto">

<UserControl.Resources>
    <l:ValueToVisibilityConverter x:Key="valueToVisibility" />
</UserControl.Resources>

<Grid>
    <ListView x:Name="listView" ItemsSource="{Binding Persons}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="140" Header="First Name" DisplayMemberBinding="{Binding FirstName}"/>
                <GridViewColumn Width="140" Header="Last Name" DisplayMemberBinding="{Binding LastName}" />
            </GridView>
        </ListView.View>

        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem 
                    Header="Open" 
                    Visibility="{Binding SelectedItem, ElementName=listView, Converter={StaticResource valueToVisibility}}"/>
                <Separator/>
                <MenuItem Header="Add..."/>
                <MenuItem Header="Remove"/>
            </ContextMenu>
        </ListView.ContextMenu>
    </ListView>
</Grid>

وشكرا جزيلا!

هل كانت مفيدة؟

المحلول

والمشكلة هي أن ContextMenu ليس في نفس الشجرة البصرية مثل ListBox، وبالتالي الارتباطات لم تجد ListBox. إذا قمت بربط ضد PlacementTarget، التي ينبغي أن تفعل خدعة:

<MenuItem Header="Open"
    Visibility="{Binding RelativeSource={RelativeSource FindAncestor,
        AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItem,
        Converter={StaticResource valueToVisibility}}" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top