天道酬勤,学无止境

Property already registered by 'ListView'

I have this code:

using System.Collections;
using System.Windows;
using System.Windows.Controls;

public static class SelectedItems
{
    private static readonly DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached(
        "SelectedItemsBehavior",
        typeof(SelectedItemsBehavior),
        typeof(ListView),
        null);

    public static readonly DependencyProperty ItemsProperty = DependencyProperty.RegisterAttached(
        "Items",
        typeof(IList),
        typeof(SelectedItems),
        new PropertyMetadata(null, ItemsPropertyChanged));

    public static void SetItems(ListView listView, IList list)
    {
        listView.SetValue(ItemsProperty, list);
    }

    public static IList GetItems(ListView listView)
    {
        return listView.GetValue(ItemsProperty) as IList;
    }

    private static void ItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var target = d as ListView;
        if (target != null)
        {
            CreateBehavior(target, e.NewValue as IList);
        }
    }

    private static void CreateBehavior(ListView target, IList list)
    {
        var behavior = target.GetValue(SelectedItemsBehaviorProperty) as SelectedItemsBehavior;
        if (behavior == null)
        {
            behavior = new SelectedItemsBehavior(target, list);
            target.SetValue(SelectedItemsBehaviorProperty, behavior);
        }
    }
}

public class SelectedItemsBehavior
{
    private readonly ListView _listView;
    private readonly IList _boundList;

    public SelectedItemsBehavior(ListView listView, IList boundList)
    {
        _boundList = boundList;
        _listView = listView;
        _listView.SelectionChanged += OnSelectionChanged;
    }

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        _boundList.Clear();

        foreach (var item in _listView.SelectedItems)
        {
            _boundList.Add(item);
        }
    }
}

XAML:

    <ListView SelectionMode="Extended" ItemsSource="{Binding Computers}" Views:SelectedItems.Items="{Binding SelectedComputers}" BorderBrush="Transparent" Height="100" VerticalAlignment="Top">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"  HorizontalAlignment="Left" VerticalAlignment="Top"  />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.Background>
            <SolidColorBrush Color="Black" />
        </ListView.Background>
    </ListView>

I've got an error of

'SelectedItemsBehaviour' property was already registered by 'Listview'.

I've used this code in two places on two separate ListViews and both give this error.

Why am I getting it, everything is static. I am using the MVVM design pattern.

Thanks,

评论

The third parameter to RegisterAttached (ownerType) must always be the class that declares the property, which is SelectedItems here.

It is a common misunderstanding that this type is a potential "target" type of the property.

private static readonly DependencyProperty SelectedItemsBehaviorProperty = DependencyProperty.RegisterAttached(
    "SelectedItemsBehavior",
    typeof(SelectedItemsBehavior),
    typeof(SelectedItems), // here
    null);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 以编程方式(平滑地)对ScrollViewer进行动画处理(Animate (smoothly) ScrollViewer programmatically)
    问题 有没有一种方法可以使Windows Phone 8.1 Runtime中的ScrollViewer的垂直偏移平滑地动画? 我尝试使用ScrollViewer.ChangeView()方法,并且无论我将disableAnimation参数设置为true还是false,垂直偏移的更改都不会设置动画。 例如: myScrollViewer.ChangeView(null, myScrollViewer.VerticalOffset + p, null, false); 偏移不使用动画即可更改。 我也尝试使用垂直偏移介体: /// <summary> /// Mediator that forwards Offset property changes on to a ScrollViewer /// instance to enable the animation of Horizontal/VerticalOffset. /// </summary> public sealed class ScrollViewerOffsetMediator : FrameworkElement { /// <summary> /// ScrollViewer instance to forward Offset changes on to. /// </summary> public
  • 使用通用ListView的动态分页(Dynamic pagination using Generic ListView)
    问题 我要求用户应该能够选择他希望在助手列表中看到的每页多少个项目。 我在Django 1.4中使用通用的ListView。 更改之前的代码如下: Class AssistantList(ListView): template_name = "register/assistant_list.html" context_object_name = 'assistant_list' paginate_by = 25 如何根据用户的选择动态设置paginate_by,而不是如上所述进行硬编码? 回答1 我只是最近才需要这样做。 您可以重写get_paginate_by函数以获取查询字符串参数。 这是一个基本的例子。 Class AssistantList(ListView): template_name = "register/assistant_list.html" context_object_name = 'assistant_list' paginate_by = 25 def get_paginate_by(self, queryset): """ Paginate by specified value in querystring, or use default class property value. """ return self.request.GET.get(
  • wpf ListView GridView 上的边距/填充设置在哪里?(Where are the margins/padding set on a wpf ListView GridView?)
    问题 我在 XAML 中有一个 WPF ListView/GridView 规范。 第一列使用 CellTemplate 来指定图标,其他列使用 DisplayMemberBinding 来填充自己。 图标栏是 20 宽,图标是 16 宽,但它们被边距/填充/某些东西截断了。 我不知道它在哪里设置。 这是要点(我删除了一些列,因为它们是相同的): <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> <Setter Property="FontWeight" Value="Normal" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="FontWeight" Value="Bold" /> </Trigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.Resources> <DataTemplate x:Key="image">
  • Android-adapter.notifyDataSetInvalidated是做什么的?(Android - What does adapter.notifyDataSetInvalidated do?)
    问题 方法adapter.notifyDataSetInvalidated()有什么作用? 没有关于它的文档。 我正在尝试重新加载ListView和notifyDataSetChanged或notifyDataSetInvalidated似乎什么都没做。 回答1 这取决于适配器的实现...如果看一下源代码,您将看到: notifyDataSetInvalidated()调用DataSetObservable类的notifyInvalidated() (请参见此处) 然后, notifyInvalidated()为每个DataSetObserver调用onInvalidated()方法(请参见此处)。 然后是有趣的部分: onInvalidated()不执行任何操作... 这是它的实现: public void onInvalidated() { // Do nothing } DataSetObserver是一个抽象类,因此由子类决定如何对onInvalidated() 。 回答2 据我所知, notifyDataSetInvalidated()方法会阻止适配器访问数据(以防数据无效,不可用等)。 notifyDataSetChanged()方法将更新ListView以便您可以看到添加的新数据,但必须在UI线程中调用它。 观看此视频对我有很大帮助-在两个部分中
  • uwp win10 Listview SelectedItem样式(uwp win10 Listview SelectedItem Style)
    问题 选择此列表后,是否可以更改ListviewItem的属性? 例如,我希望ListviewItem内的一个矩形在被选中时为红色,默认情况下为蓝色。 如何以优雅的方式实现这一目标? 回答1 您可以设置ListView.ItemContainerStyle以自定义ListViewItems使用的ListView样式。 此页面显示默认样式:https://msdn.microsoft.com/zh-cn/library/windows/apps/mt299136.aspx 以您的示例为例-您可以通过类似于以下代码的方式更改Selected~Background属性: <ListView ...> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListViewItem"> <ListViewItemPresenter ContentTransitions="{TemplateBinding ContentTransitions}" SelectionCheckMarkVisualEnabled="True" CheckBrush="{ThemeResource
  • ListView is not reflecting changes
    I created a TableView a while back and registered Properties to each of the TableColumns. Editing of the internal data reflected itself back in the TableView just fine. With a ListView, however, it is a different story. The changes are not being shown right away unless I close the frame and open it again. My ListView consists of ActionSteps. Note that I used the Javafx beans properties. package application.objects; import java.time.LocalDate; import java.util.ArrayList; import java.util.function.IntPredicate; import javafx.beans.property.IntegerProperty; import javafx.beans.property
  • 通过 ListView 获取 ListCell(Get ListCell via ListView)
    问题 我有一个带有我自己的ListCell<MyObject>实现的ListView 。 通过网络信号,我收到了应该更改的 ListCell 索引。 在listView.getItems().get(index); 访问模型没有问题,但我想使用接收到的索引对listCell进行布局更改,并使用index+1;对ListCell进行布局更改index+1; 如何通过 ListView 访问 ListCell? 我搜索这样的方法: listView.getListCell(index); 回答1 不幸的是,现在没有 API 可以通过索引获取 List Cell 或获取 ListView 的所有子项(listcells)。 一种解决方案是,在 MyObject 类中定义一个新的 StringProperty specialIndicator。 class MyObject { ....//u r properties private StringProperty specialIndicator; 当您从网络信号中获取索引时,请设置对象的这个特殊指标属性并强制刷新 ListView public void onReceivedNetWorkSignalIndex() { listView.getItems().get(indexFromService)
  • Windows Phone 8.1中的ListView中的行的交替颜色(Alternating Colors of rows in ListView in Windows Phone 8.1)
    问题 我创建了Windows Phone 8.1运行时应用程序。 我正在使用ListView控件。 我要替换每个背景行的颜色。 搜索后,我发现此链接是先前的答案。 但这会给标记带来错误。 一方面,没有“ AlternationCount”属性。 我假设这是因为它不是SilverLight而是RT? 如果有人在我努力寻找一个简单的例子时可以给我发送链接。 一个更好的简单代码示例将不胜感激。 回答1 我的建议是使用带有附加DependencyProperties的Converter类。 初始化转换器时,可以定义转换器将引用的项目集合以及背景的备用笔刷列表。 它可以看起来像这样: public class AlternateConverter : DependencyObject, IValueConverter { public List<SolidColorBrush> AlternateBrushes { get { return (List<SolidColorBrush>)GetValue(AlternateBrushesProperty); } set { SetValue(AlternateBrushesProperty, value); } } public static readonly DependencyProperty
  • 如何在已经在一个 DragEvent 中注册一个 DragEvent 并让它在当前 DragEvent 中监听?(How to register a DragEvent while already inside one and have it listen in the current DragEvent?)
    问题 我的问题与 Android 中的拖放 API 有关。 如果我的问题令人困惑,我深表歉意。 但本质上,当您想要开始拖放操作时,您必须在View上调用startDrag() 。 您将一些信息传递给它,然后给它一个OnDragListener在其中侦听被拖动的View 。 当拖动开始时,在我的示例中长按,所有可以接受任何信息的视图都向系统注册以接受此信息。 如果您在拖放操作的 android 文档中快速阅读其中的一些内容,会更有意义。 但是,假设您以前没有使用过并且愿意使用它,那么这是对它如何工作的快速概述。 现在我的问题基本上是我遇到的一个问题。 我想在onDragListener运行时创建一个View ,它也接受当前被拖动View系统信息。 问题是它不工作。 我并不感到惊讶,因为在拖动操作第一次开始时没有注册视图。 问题是我怎样才能即时注册它。 android 文档向您展示了如何在开始时注册它,而不是在它已经注册时。 MyDragListener (我的 onDragListener 的代码。现在只玩它。) protected class MyDragListener implements View.OnDragListener { @Override public boolean onDrag(View v, DragEvent event) { // Defines a
  • WPF Listview SelectionChanged 事件(WPF Listview SelectionChanged event)
    问题 我有一个ListView绑定到一个ItemsSource并且SelectionChanged事件正在加载/数据绑定事件上触发? 我认为这是因为选择了“默认”项目,即索引 0。 我怎样才能禁用它? 回答1 如果您只设置 ItemsSource 属性,则 listView 不应触发 SelectionChange。 但是,如果将 SelectedIndex 属性绑定到 dataContext 对象的属性,则选择将移动到绑定属性指定的索引。 这不会在页面加载时触发 Selector_OnSelectionChanged 事件: <ListView SelectionChanged="Selector_OnSelectionChanged" ItemsSource="{Binding Path=Items}" ></ListView> 但这确实: <ListView SelectionChanged="Selector_OnSelectionChanged" SelectedIndex="{Binding Path=SelectedIndexValue}" ItemsSource="{Binding Path=Items}" ></ListView> 因为 SelectedIndex 通过绑定设置为 SelecteIndexValue。 为了避免这种情况并仍然保持标记中的绑定
  • Xamarin.Forms:获取列表视图的所有单元格/项目(Xamarin.Forms: Get all cells/items of a listview)
    问题 我想对ListView中显示的所有单元格进行一些更改。 因此,我想获取所有单元格或项目。 例如 this.listView.ItemSource.Items 在上面的代码项目不存在。 此外,我没有在ListView或ItemSource上找到任何可以执行此操作的选项。 是否可以获取所有单元格/项目? 如果不是,在加载单元之后,我还必须更改其他选项吗? 例如,用于更改文本或布局。 回答1 通常,您不会直接触摸您的单元格。 相反,如果可能,您尝试通过数据绑定进行所有操作。 让我们使用XAML中定义的以下Page: <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="App6.Page1"> <ListView x:Name="myList" BackgroundColor="Gray" ItemsSource="{Binding MyItems}" HasUnevenRows="true" RowHeight="-1"> <ListView.ItemTemplate> <DataTemplate>
  • 禁用选定的Listview项目的蓝色边框(Disable blue border for selected Listview item)
    问题 我有一个带有水平WrapPanel的ListView作为它的ItemsPanelTemplate。 我想摆脱所选项目的蓝色背景。 它仅在所选项目的左侧可见。 关于SO有很多类似的问题,我尝试了很多解决方案,但没有一个起作用。 这是我已经尝试过的: <ListView.Resources> <Style TargetType="{x:Type ListViewItem}"> <Style.Resources> <!-- Foreground for Selected ListViewItem --> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/> <!-- Background for Selected ListViewItem --> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> <!--SelectedItem without focus--> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent"/> <
  • 如何在UWP中找到相对源模式的祖先(或等效祖先)(How to do relativesource mode find ancestor (or equivalent) in UWP)
    问题 我正在尝试做一些人们认为应该非常简单的事情(至少在WPF中是如此)。 我有一个带有列表框和数据模板的页面,现在该数据模板调用其中带有按钮的用户控件。 没什么好看的,但是按钮命令不是listboxsource的一部分,我找不到一种简单的方法来告诉按钮在哪里寻找命令。 这是场景 <Page x:Class="App1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1"> <Page.Resources> <DataTemplate x:Key="MyDataTemplate"> <local:MyButton /> </DataTemplate> </Page.Resources> <ListBox ItemTemplate="{StaticResource MyDataTemplate}" ItemsSource="{Binding Customers}" /> </Page> <UserControl x:Class="App1.MyButton" xmlns="http://schemas.microsoft.com
  • WPF 高级篇 MVVM (MVVMlight)绑定
    我们这边来实现MvvMlight 主界面功能 实现数据显示 我们看界面元素 一个ListView 4个值固定的TextBlock 对应下面4个更具选择动态变化的TextBlock 三个Button 那么 分析一下需要的绑定对象 一个是Listview 需要一个 集合对象 选中集合对象 我们要把数据显示到右面 4个TextBlock 里 那么我们还需要被选中的对象 三个Button 就有三个事件 我们整理一下 一个集合 一个选择对象 三个事件 我们开始写Mainwindow 绑定 private ObservableCollection<Book> _allBooks; public ObservableCollection<Book> AllBooks { get { return _allBooks; } set { Set(ref _allBooks ,value); } } private Book selectedBook; public Book SelectedBook { get { return selectedBook; } set { Set(ref selectedBook , value); EditBookCommand.RaiseCanExecuteChanged(); DeleteBookCommand.RaiseCanExecuteChanged()
  • WPF: Bind to command from ControlTemplate
    I am trying to add a button to a custom ListView (MyListView) which triggers a command (MyCustomCommand) defined in MyListView. I have added the button (and a title text) by applying a ControlTemplate. The problem is that I have not found a way to trigger MyCustomCommand when clicking the button. What I eventually want to achieve is to open a Popup or ContextMenu where I can select which columns should be visible in the ListView. Here's my template source: <Style TargetType="local:MyListView"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:MyListView"> <Border
  • 即使将焦点放在另一个控件上,如何更改listview所选行的背景色?(How to change listview selected row backcolor even when focus on another control?)
    问题 我有一个使用条形码扫描仪作为输入设备的程序,这意味着我需要将重点放在文本框上。 该程序具有一个listview控件,当扫描特定条形码时,我将以编程方式选择其中一项。 我通过以下方式设置行的背景色: listviewitem.BackColor = Color.LightSteelBlue; 我尝试过的事情: listview.HideSelection设置为false 设置颜色后调用listview.Focus() listviewitem.Focused设置为true 呼叫listview.Invalidate 呼叫listview.Update() 调用listview.Refresh() 上面的不同组合 我还在计时器中进行了上述组合,因此它们在不同的线程上被调用,但仍然没有成功。 有任何想法吗? 更多信息: 这里的关键是控制焦点。 选择其中一项时, listview控件没有焦点。 我通过执行以下操作选择一项: listView1.Items[index].Selected = true; 焦点始终在文本框中。 该计算机没有键盘或鼠标,只有条形码读取器。 我有以下代码可以将重点放在文本框上: private void txtBarcode_Leave(object sender, EventArgs e) { this.txtBarcode.Focus(); }
  • JavaFX 2.2:如何强制重绘/更新 ListView(JavaFX 2.2: How to force a redraw/update of a ListView)
    问题 我在 JavaFX 2 模式对话框窗口中有一个 ListView 控件。 此 ListView 显示 DXAlias 实例,其 ListCell 由单元工厂制造。 工厂对象所做的主要事情是检查 ListView 的 UserData 属性数据,并将其与 ListCell 对应的项进行比较。 如果它们相同,则 ListCell 的内容呈现为红色,否则呈现黑色。 我这样做是为了指示 ListView 中的哪些项目当前被选为“默认”。 这是我的 ListCell 工厂类,所以你可以明白我的意思: private class AliasListCellFactory implements Callback<ListView<DXSynonym>, ListCell<DXSynonym>> { @Override public ListCell<DXSynonym> call(ListView<DXSynonym> p) { return new ListCell<DXSynonym>() { @Override protected void updateItem(DXSynonym item, boolean empty) { super.updateItem(item, empty); if (item != null) { DXSynonym dx = (DXSynonym)
  • 为列表视图列设置不同的对齐方式(Setting different alignments for listview columns)
    问题 我在绘制列左对齐或居中对齐的列表视图时遇到问题。 我查看了我在此处或其他论坛上找到的一些解决方案,但它们似乎适用于所有专栏,或者我无法让它们工作。 到目前为止,我得到的最好的是这段代码,但所有内容都是左对齐的(我已经将右对齐放入来测试代码)。 有人能告诉我我哪里出错了吗? <ListView Name="lsvQuestions" DockPanel.Dock="Bottom"> <ListView.View> <GridView> <GridViewColumn Width="450" Header="Question Text"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding QuestionText}" TextAlignment="Left"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="200" Header="Type"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding QuestionType}" TextAlignment="Right"/>
  • ListView没有反映出变化(ListView is not reflecting changes)
    问题 我创建了一个TableView,并向每个TableColumns注册了Properties。 内部数据的编辑本身可以很好地反映在TableView中。 但是,使用ListView则是另一回事了。 除非关闭框架并再次打开,否则更改不会立即显示。 我的ListView包含ActionSteps。 请注意,我使用了Javafx bean属性。 package application.objects; import java.time.LocalDate; import java.util.ArrayList; import java.util.function.IntPredicate; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class
  • 属性元数据已经为“时间轴”属性注册(Property Metadata is already registered for “Timeline” property)
    问题 我有一个由客户端软件调用的WPF应用程序。 第一次运行良好。当我从客户端软件关闭WPF应用程序并再次加载WPF应用程序(而没有在两者之间关闭客户端软件)时,它抛出异常,因为“属性元数据已经为“时间轴”注册了”属性”的以下代码: Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 5 }); 然后,我在我的应用程序中注释了上面的代码行,并再次重复了上面提到的相同情形,它引发异常,因为Run()中的“调用者线程无法访问此对象,因为另一个线程拥有它”。 下面是我在WPF应用程序中使用“时间轴”属性的方法。 public void start() { Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = 5 }); //Property Metadata is already registered for the "Timeline" property. Run(); // The caller thread cannot