4

我在绑定到我的用户控件的资源部分中定义的工作时遇到了一些麻烦。当我将它绑定到数据网格的列时,相同的绑定似乎稍后在 xaml 中起作用。在样式声明中它只是不会显示数据。

我得到的错误是

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“CollectionViewGroupInternal”(HashCode=5477078)上找不到“ReceivedDate”属性。绑定表达式:路径=接收日期;DataItem='CollectionViewGroupInternal' (HashCode=5477078); 目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

以下绑定 ReceivedDate 在运行时未解析。

<UserControl.Resources>

    <!-- Grouped Items Header: Show the messages in a group. ex: date received -->
    <Style x:Key="GroupedItemsHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander x:Name="exp" IsExpanded="True"
                              Background="LightGray"
                              Foreground="Black">
                        <Expander.Header>
                            <TextBlock Text="{Binding Path=ReceivedDate, Converter={StaticResource DateToSortGroupConverter}}" Foreground="Black"/>
                        </Expander.Header>
                        <ItemsPresenter/>
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</UserControl.Resources>

在此 UserControl 的代码隐藏中,我将 itemsList 设置如下。

    void MailController_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "CurrentMailBoxContent")
        {
            var currentMailBox = ((App) Application.Current).MailController.CurrentMailBoxContent;
            var collection = new ListCollectionView(currentMailBox);

            collection.GroupDescriptions.Add(new PropertyGroupDescription("ReceivedDate"));
            ContentDataGrid.ItemsSource = collection;
        }
    }

CurrentMailBoxContent 是一个

ObservableCollection<MailMessage>;

并且 ReceivedDate 是 MailMessage 类中的一个属性。

public class MailMessage : INotifyPropertyChanged
{
    #region Fields

    public event PropertyChangedEventHandler PropertyChanged;

    private DateTime _receivedDate;

    #endregion

    #region Constructor

    public MailMessage(){}

    #endregion

    #region Properties


    public DateTime ReceivedDate
    {
        get { return _receivedDate; }
        set
        {
            if (_receivedDate == value) return;
            _receivedDate = value;
            OnPropertyChanged("ReceivedDate");
        }
    }

    #endregion

    #region methods

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

我尝试将绑定的路径更改为 /ReceivedDate。

让我感到困惑的是,相同的绑定在其他地方声明时有效。例如在各个列标题中。

4

1 回答 1

9

Expander.Header没有获得您的视图模型之一。相反,标头获取一个继承自CollectionViewGroup该对象的对象,该对象具有两个名为Name和的属性ItemCount

于 2015-05-23T09:23:48.527 回答