C# WPF如何将数组设置为属性
我正在使用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) {
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>