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

时间:2012-02-26 15:01:07

标签: wpf binding

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

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

实施例。 Map对象中包含Cell对象(VM表示视图模型):

public class MapCellVM
{
    public bool IsPassable { get; set; }
}

public class MapVM
{   
    public MapCellVM[,] CellMap { get; set; }
}

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

1 个答案:

答案 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