簡體   English   中英

關於WPF綁定的困惑

[英]Confusion about WPF binding

我試圖將排列在堆棧面板中的2D按鈕數組綁定到2D ObservableCollection ...

但是,恐怕我對綁定不是很了解。

我的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; 
    }
}

ViewModel:

class CalendarViewModel
{
    CalendarMonth _displayedMonth;
    EventCalendar _calendar;

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

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

我正在嘗試使用CalendarViewModel.DayNumbers中的值填充按鈕-但是按鈕沒有出現。 我的綁定顯然做錯了。

將所有DynamicResource更改為StaticResource 這不應該停止它的工作,但是可能在運行時效率低下。 查看此頁面以獲取WPF資源概述。

此外,您的ItemsControl也不綁定到DayNumbers 像這樣添加綁定:

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

在“日歷”窗口上設置DataContext時,將設置哪個對象將是整個窗口的默認綁定源。 您沒有指定ViewModel的哪個屬性綁定到ItemsControl 這就是上面的代碼所做的。

編輯因為要覆蓋ItemsControl的項目模板並在那里提供收集容器,所以還需要為其提供ItemsSource 語法{Binding}僅表示綁定到每個成員或枚舉 ,在本例中為ObservableCollection<int>

重申一下,模板就是這樣-用於顯示數據的模板。 它應該是可重用的,您應該能夠將其綁定到所需的任何模型。 經驗法則-綁定到實際數據的數據應在控件而不是模板上發生。

  1. 就像Igor所說的那樣,您需要在最外面的ItemsControl指定ItemsSource={Binding DayNumbers} ,否則,它將綁定到DataContext ,后者是CalendarViewModel ,並且不是IEnumerable

  2. 一旦你這樣做,它將適用<DataTemplate x:Key="PanelOfPanels">對於內部每個項目DayNumbers 需要注意的是DataContext所述的DataTemplate的每個元素中DayNumbers ,這是類型ObservableCollection<int> 在這里,您不能指定ItemsSource="{Binding Path=DayNumbers}"因為DayNumbersObservableCollection<int>不是有效的屬性。 相反,由於ObservableCollection<int>已經是IEnumerable ,所以最好不指定ItemsSource因為默認情況下它將綁定到DataContext

  3. 最后,它進入最里面的<DataTemplate x:Key="ItemsAsButtons"> ,您可以像執行操作一樣在此處放置按鈕。

希望它能澄清一點。 抱歉,我沒有環境進行測試並提供解決方案。

調試WPF綁定並不簡單。 一個技巧是您可以使用虛擬轉換器並在Convert方法中設置斷點以查看其綁定。

public class DebugConverter1 : IValueConverter
  {
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
       return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      return value;
    }

    #endregion
  }

{Binding Converter={StaticResource debugConverter1}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM