我有一个自定义类型的对象数组。我有一个与这些对象相关的按钮数组。我想通过点击他的按钮来改变任何对象。所以按钮必须“知道”他们的对象。对象必须“知道”他们的按钮。如何将它们相互绑定(一个对象仅与一个按钮绑定,反之亦然)?
此外,它必须是C#代码,而不是XAML,因为我将以dinamically方式构造这些数组。
实施例。 Map对象中包含Cell对象(VM表示视图模型):
public class MapCellVM
{
public bool IsPassable { get; set; }
}
public class MapVM
{
public MapCellVM[,] CellMap { get; set; }
}
每个单元格必须显示为一个按钮。因此,用户只需单击特定按钮即可更改任何单元对象的IsPassable属性。
答案 0 :(得分:0)
我不确定您到目前为止是如何实现您的问题的,所以我可以举个例子来说明我将如何设计它。当您想要显示自定义对象列表时,我将使用ItemsControl
来显示它们,并在每个自定义对象上显示一个从XAML触发的命令。这仍然可以让你有机会处理代码中的所有内容。这是一个示例:
自定义对象
public class CustomObject
{
public ICommand DoSomethingCommand { get; private set; }
public CustomObject()
{
DoSomethingCommand = new DelegateCommand(DoSomething);
}
private void DoSomething(object obj)
{
// TODO: do something
}
}
如果你还没有使用DelegateCommand
的实现,请查看Prism中的源代码(或其他任何地方,有很多样本)。
MainWindow(XAML的一部分)
<ItemsControl x:Name="itemsControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="Do Something" Command="{Binding DoSomethingCommand}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
MainWindow(代码落后)
public partial class MainWindow : Window
{
private ObservableCollection<CustomObject> _customObjects;
public MainWindow()
{
InitializeComponent();
_customObjects = new ObservableCollection<CustomObject>();
Loaded += MainWindowLoaded;
}
private void MainWindowLoaded(object sender, RoutedEventArgs e)
{
itemsControl.ItemsSource = _customObjects;
_customObjects.Add(new CustomObject());
}
}
那就是它。每次单击按钮时,都会执行方法DoSomething
。