Wpf 如何绑定自定义类型对象和控件?

Wpf 如何绑定自定义类型对象和控件?,wpf,binding,Wpf,Binding,我有一个自定义类型的对象数组。我有一个与这些对象相关的按钮数组。我想通过点击任何物体的按钮来改变它。所以按钮必须“知道”它们的对象。对象必须“知道”它们的按钮。如何将它们彼此绑定(一个对象只绑定一个按钮,反之亦然) 此外,它必须是C#代码,而不是XAML,因为我将以友好的方式构造这些数组 例如。存在包含单元格对象的映射对象(VM表示视图模型): 每个单元格必须显示为一个按钮。因此,用户只需单击特定按钮即可更改任何单元格对象的IsPassable属性。我不确定您到目前为止是如何意识到您的问题的,因

我有一个自定义类型的对象数组。我有一个与这些对象相关的按钮数组。我想通过点击任何物体的按钮来改变它。所以按钮必须“知道”它们的对象。对象必须“知道”它们的按钮。如何将它们彼此绑定(一个对象只绑定一个按钮,反之亦然)

此外,它必须是C#代码,而不是XAML,因为我将以友好的方式构造这些数组

例如。存在包含单元格对象的映射对象(VM表示视图模型):


每个单元格必须显示为一个按钮。因此,用户只需单击特定按钮即可更改任何单元格对象的IsPassable属性。

我不确定您到目前为止是如何意识到您的问题的,因此我可以给您一个我将如何设计它的示例。当您想要显示自定义对象的列表时,我将使用
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中查看它的源代码(或其他任何地方,都有很多示例)

主窗口(XAML的一部分)


主窗口(代码隐藏)

公共部分类主窗口:窗口
{
私有ObservableCollection\u customObjects;
公共主窗口()
{
初始化组件();
_customObjects=新的ObservableCollection();
加载+=主窗口加载;
}
private void MainWindowLoaded(对象发送器,路由目标)
{
itemsControl.ItemsSource=\u customObjects;
_添加(新的CustomObject());
}
}

就这样。每次单击按钮时,都会执行方法
DoSomething

请提供一个代码示例和有关您迄今为止尝试过的方法的更多信息。
public class CustomObject
{
    public ICommand DoSomethingCommand { get; private set; }

    public CustomObject()
    {
        DoSomethingCommand = new DelegateCommand(DoSomething);
    }

    private void DoSomething(object obj)
    {
        // TODO: do something
    }
}
<ItemsControl x:Name="itemsControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="Do Something" Command="{Binding DoSomethingCommand}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
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());
    }
}