Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用WPF中的可绑定项创建DependencyProperty集合_C#_Wpf_Binding - Fatal编程技术网

C# 如何使用WPF中的可绑定项创建DependencyProperty集合

C# 如何使用WPF中的可绑定项创建DependencyProperty集合,c#,wpf,binding,C#,Wpf,Binding,我需要创建DependencyProperty集合 并以某种方式绑定或能够知道每个项目何时更改 解释这个问题不容易 要声明一个简单的DependencyProperty,我们需要执行以下操作: public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register("SelectedColor", typeof(Color), typeof(MyClass)

我需要创建DependencyProperty集合 并以某种方式绑定或能够知道每个项目何时更改

解释这个问题不容易

要声明一个简单的DependencyProperty,我们需要执行以下操作:

public static readonly DependencyProperty SelectedColorProperty =
        DependencyProperty.Register("SelectedColor", typeof(Color),
    typeof(MyClass), new PropertyMetadata(Colors.Red));

public Color SelectedColor
{
 get { return (Color)GetValue(SelectedColorProperty); }
 set { SetValue(SelectedColorProperty, value); }
}
稍后在XAML中,我们可以做到这一点:

<MyClass SelectedColor="{Binding blah blah}"/>
但是,我不能使用多重绑定,因为我想知道哪种颜色有多重绑定 更改和多重绑定为我提供了聚合器策略,这意味着 我完成了多重绑定转换器的编写,我将得到所有的值 从所有的“废话”在同一时间,将无法知道哪一个 一个是改变了的

我开始写一些简单的东西,如下所示:

public static readonly DependencyProperty SelectedColorsProperty =
           DependencyProperty.Register("SelectedColors", typeof(List<Color>),
       typeof(MyClass),
           new PropertyMetadata(new List<Color>()));

  public List<Color> SelectedColors
        {
            get { return (List<Color>)GetValue(SelectedColorsProperty); }
            set { SetValue(SelectedColorsProperty, value); }
        }

   public MyClass()
        {
            foreach(var item in SelectedColors)
            {
        //dunno what goes here.. or how to bind the color change?
            }
        }
公共静态只读从属属性SelectedColorsProperty=
从属属性寄存器(“选定颜色”,类型(列表),
类型(MyClass),
新属性元数据(新列表());
公共选择颜色列表
{
获取{return(List)GetValue(SelectedColorsProperty);}
set{SetValue(SelectedColorsProperty,value);}
}
公共MyClass()
{
foreach(选定颜色中的变量项)
{
//不知道这是什么…或者如何绑定颜色变化?
}
}
所以现在我不能创建一个回调来处理每个项的每个更改,对吗? 然而,这正是我所需要的,能够对每个项目的变化做出反应

但是,它确实允许我表达我需要的XAML语法

有什么想法吗?以前有人碰到过这种问题吗? 我注意到MSDN中有非常简短的解释,但我不确定它是否对我有帮助以及如何帮助我 如果有帮助的话,就使用它,这是页面中提到的最后一段 关于使用

Freezable<T>
Freezable

我感谢你的帮助, 谢谢


更新:多绑定解决方案也可以,如果它允许区分哪些值发生了更改(在我们的示例中,哪些颜色发生了更改)
这种情况下的标记可能如下所示:

<MyClass>
   <MyClass.SelectedColors>
    <Color>{Binding blah1}</Color>
    <Color>{Binding blah2}</Color>
    <Color>{Binding blahN}</Color>
   <MyClass.SelectedColors>
</MyClass>
<MyClass>
   <MyClass.SelectedColors>
      <MultiBinding..
        <Binding Path="FillColor" ElementName="MyRectWhichHasFillColorDProperty"/>
        <Binding blah2 which is Color2 />
        <Binding blah3 which is ColorN />


将颜色包装到实现INotifyPropertyChanged的类中,然后为构造函数中的每个颜色设置PropertyChanged事件的侦听器

包装类

public class ColorViewModel : INotifyPropertyChanged
{
    private Color color;
    public Color Color
    {
        get { return color; }
        set
        {
            if (value != color)
            {
                color = value;
                NotifyPropertyChanged("Color");
            }
        }
    }

    // INotifyPropertyChanged implementation goes here
}
然后在事件侦听器中,您将获得触发属性更改事件的单个ColorViewModel

我以前必须解决一个非常类似的问题,我创建了ViewModel类的ObservableCollection,以便订阅集合更改并将事件侦听器附加/分离到更改的项

我在表面上的记忆中输入了这个,所以可能有很多打字错误,您应该将代码示例作为sudo代码

希望这有帮助

编辑

以下是您的Xaml的外观:

<namespace:MyClass>
    <namespace:MyClass.SelectedColors>
        <namespace:ColorViewModel Color="{Binding SomeValue}" />
        <namespace:ColorViewModel Color="{Binding OtherValue}" />
    </namespace:myClass.SelectedColors>
</namespace:MyClass>

其中
Colors
ColorViewModel
的集合

您将无法在构造函数中连接
PropertyChanged
侦听器,因为在构建时,没有颜色的ColorViewModels,因此,我只需将颜色设置为
可观察集合
,并使用
CollectionChanged
事件将
PropertyChanged
侦听器连接到集合中的任何新添加项


您可能只想使用SolidColorBrush而不是ColorViewModel类,因为它具有
Color
属性和
Changed
事件。

是否尝试使用ObsableCollection?嗯,为什么?我不需要知道收藏中的物品是什么时候被添加、删除、替换或清除的——我只需要知道物品本身是什么时候被更改的,例如红色变为绿色。我想没有什么比以某种方式进行多重绑定更好的了。首先,谢谢你。但是XAML方面的情况会如何呢?请记住,我特别列出了使用XAML时需要的外观。我添加了一个示例,说明了
XAML
的外观。我想再过一点时间,它可能会更接近。自从我在我最初的帖子上从臀部开始拍摄以来,我就已经测试过这个了,它对我很有效。