C# WPF如何将数组设置为属性

C# WPF如何将数组设置为属性,c#,arrays,wpf,C#,Arrays,Wpf,我正在使用WPF,我有一组椭圆,我想在运行时更改它们的颜色。这是我的密码 Color[] ellipsecolor = new Color[13]; public event PropertyChangedEventHandler PropertyChanged; private void onPropertyChanged(String propertyName) { if (PropertyChanged != null) {

我正在使用WPF,我有一组椭圆,我想在运行时更改它们的颜色。这是我的密码

Color[] ellipsecolor = new Color[13];
public event PropertyChangedEventHandler PropertyChanged;

    private void onPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
我想这样做:

Ellipse x:Name="Spot5" Fill="Gray" StrokeThickness="6" Width="40" 
Height="40" Margin="219,211,241,249" MouseDown="Ellipse_MouseDown"
  ..
 SolidColorBrush Color= "{Binding ellipsecolor[0],IsAsync=True}"/>
但我不确定我是否能做到这一点。
可以这样做吗?

无需使用数组。您可以索引到xaml中的ObservableCollection中,类似于索引到数组中。但是,集合的类型需要实现INotifyPropertyChanged。理想情况下,您应该创建一个从Color继承的类型并实现INotifyPropertyChanged,但由于Color类是密封的,所以这是不可能的

但是,用您自己的类型包装颜色应该可以

 class MyColor : INotifyPropertyChanged
 {        
        public event PropertyChangedEventHandler PropertyChanged;

        private Color _color;

        public Color color
        {
            get
            {
               return _color;
            }

            set
            {
               _color = value;
               OnPropertyChanged("color");
            }
        }

        void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
  }   
在适当的地方实例化集合

   ObservableCollection<MyColor> ellipseColors = new ObservableCollection<MyColor>();
这篇文章的一些想法值得称赞

更新:


不确定您使用的是哪个MVVM框架,但一般的方法是:

在ViewModel层中,为椭圆创建VM:

public class EllipseVM : ObservableObject
{
    private Color _Color;
    public Color Color
    {
      get => _Color;
      set => Set(ref _Color, value);
    }

    private double _X;
    public double X
    {
      get => _X;
      set => Set(ref _X, value);
    }

    private double _Y;
    public double Y
    {
      get => _Y;
      set => Set(ref _Y, value);
    }
}
在主ViewModel中创建这些椭圆的集合:

public class MainVM : ViewModelBase
{
    private ObservableCollection<EllipseVM> _Ellipses;
    public ObservableCollection<EllipseVM> Ellipses
    {
      get => _Ellipses;
      set => Set(ref _Ellipses, value);
    }
}
要点 您可以在运行时向集合中添加任意数量的省略号。视图层将自动更新自身,因为您的集合是ObservableCollection。 ItemsControl使用画布作为面板,允许您使用X、Y坐标定位椭圆。这允许您在运行时放置或移动椭圆。 请注意,画布属性需要通过ItemContainerStyle而不是通过ItemTemplate进行设置。这是因为ItemsControl为集合中的每个项生成包装器元素。然后将数据模板放在该包装器中,因此需要设置该包装器元素的位置,这正是ItemContainerStyle所做的。 如果VM层由于是视图级库而无法使用Color类,则可以使用将EllipseVM的Color属性设置为int类型。然后需要在视图层中创建一个转换器,以将int值转换为Color。 我使用了MVVM Light中的助手类,例如ViewModelBase和ObservableObject。如果您使用的是不同的框架,请用它们的计数器部件替换它们。 您必须将视图的DataContext设置为MainVM。您可以通过MVVM灯光中的ViewModelLocator来实现这一点。您也可以直接在XAML或代码隐藏中实现这一点。
他有不止一个椭圆,所以他不能在XAML中执行[0]。我不确定我是否理解。不管有多少省略号,每个省略号都可以绑定到他们想要的集合中的任何索引,不是吗?是的,但是您使用的是WPF。你不应该那样做。一个ItemsControl是正确的方法。你有一个可以改变颜色的椭圆,或者13个不同的椭圆,它们都有不同的不改变颜色吗?我没有使用MVVM@Nia2:好的。如果你在WPF里做什么严肃的事情,你应该这么做。
public class EllipseVM : ObservableObject
{
    private Color _Color;
    public Color Color
    {
      get => _Color;
      set => Set(ref _Color, value);
    }

    private double _X;
    public double X
    {
      get => _X;
      set => Set(ref _X, value);
    }

    private double _Y;
    public double Y
    {
      get => _Y;
      set => Set(ref _Y, value);
    }
}
public class MainVM : ViewModelBase
{
    private ObservableCollection<EllipseVM> _Ellipses;
    public ObservableCollection<EllipseVM> Ellipses
    {
      get => _Ellipses;
      set => Set(ref _Ellipses, value);
    }
}
<ItemsControl ItemsSource="{Binding Ellipses}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <Canvas />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>

  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Ellipse Fill="{Binding Color}" Width="40" Height="40" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>

  <ItemsControl.ItemContainerStyle>
    <Style>
      <Setter Property="Canvas.Left" Value="{Binding X}" />
      <Setter Property="Canvas.Top" Value="{Binding Y}" />
    </Style>  
  </ItemsControl.ItemContainerStyle>
</ItemsControl>