c# - 关于 WPF 绑定(bind)的困惑

标签 c# wpf xaml mvvm binding

我正在尝试将排列在堆栈面板中的 2D 按钮数组绑定(bind)到 2D ObservableCollection ...

然而,恐怕我不了解绑定(bind)的一些非常基本的东西。

我的 XAML:

    <Window.Resources>
    <DataTemplate x:Key="ItemsAsButtons">
        <Button Content="{Binding}" Height="100" Width="100"/>
    </DataTemplate>
    <DataTemplate x:Key="PanelOfPanels">
        <ItemsControl ItemsSource="{Binding Path=DayNumbers}" ItemTemplate="   {DynamicResource ItemsAsButtons}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DataTemplate>
    </Window.Resources>

...
        <ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
                      ItemTemplate="{DynamicResource PanelOfPanels}"/>

我的 C# 代码:
后端:
/// <summary>
/// Window BE for Calendar.xaml
/// </summary>
public partial class Calendar : Window
{

    private CalendarViewModel _vm;
    public Calendar()
    {
        InitializeComponent();
        _vm = new CalendarViewModel();
        this.DataContext = _vm; 
    }
}

View 模型:
class CalendarViewModel
{
    CalendarMonth _displayedMonth;
    EventCalendar _calendar;

    public CalendarViewModel()
    {
        _displayedMonth = new CalendarMonth();
    }

    public ObservableCollection<ObservableCollection<int>> DayNumbers
    {
        get
        {
            return _displayedMonth.DayNumbers;
        }
    }
}

我正在尝试使用 CalendarViewModel.DayNumbers 中的值填充按钮 - 但按钮没有出现。我的绑定(bind)显然做错了什么。

最佳答案

改变你所有的DynamicResourceStaticResource .这不应该停止它的工作,但在运行时可能效率低下。看看this page WPF 资源概述。

还有你的ItemsControl未绑定(bind)到 DayNumbers .像这样添加绑定(bind):

<ItemsControl x:Name="DaysPanel" Grid.ColumnSpan="7" Grid.Row="2"
                  ItemTemplate="{StaticResource PanelOfPanels}"
                  ItemsSource={Binding DayNumbers}/>

当您设置 DataContext在日历窗口上,您设置哪个对象将成为整个窗口的默认绑定(bind)源。您没有指定 ViewModel 的哪个属性绑定(bind)到 ItemsControl .这就是上面的代码所做的。

编辑 因为您要覆盖 ItemsControl 的项目模板并在那里提供收集容器,您需要提供ItemsSource也为它。语法 {Binding}简单的意思是绑定(bind)到每个成员或枚举 , 在这种情况下 ObservableCollection<int> .

重申一下,模板就是这样 - 用于显示数据的模板。它应该是可重用的,你应该能够将它绑定(bind)到你想要的任何模型。经验法则 - 与实际数据的数据绑定(bind)应该发生在控件上,而不是模板上。

关于c# - 关于 WPF 绑定(bind)的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2879080/

相关文章:

c# - 如何对具有相同属性名称的多个属性使用 select 方法

c# - 用户同时创建表时如何使用 Entity Framework

c# - 在 WPF Datagrid 中将动态图像设置为自动生成的列

.net - Silverlight:TargetType 的属性类型无效 ="{x:Type TextBlock}"

wpf - 我可以为 WPF 中的一系列键创建 KeyBinding 吗?

Wpf- 无法将 MenuItem 转换到列表框?

c# - 如何使用不带属性的 SelectNode() 检索 XML 节点列表?

c# - 如何解析像 '/aaa/bbb/ccc/ddd' 这样的字符串?

c# - 使用 BeginInvoke 动态添加 ListView 项时出现 "The calling thread must be STA, because many UI components require this."

c# - 将用户控件列表插入到特定的列和行