C# CoverFlow控件的数据绑定选定项属性?

C# CoverFlow控件的数据绑定选定项属性?,c#,xaml,windows-8,windows-runtime,coverflow,C#,Xaml,Windows 8,Windows Runtime,Coverflow,我正在使用 我正在尝试将此控件的selected Item属性绑定到一个属性,但没有任何效果。下面是我正在使用的代码,请让我知道我犯了什么错误 <controls:CoverFlow Height="85" Margin="0,40,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SpaceBetweenItems="35" SelectedItem=

我正在使用

我正在尝试将此控件的selected Item属性绑定到一个属性,但没有任何效果。下面是我正在使用的代码,请让我知道我犯了什么错误

 <controls:CoverFlow
     Height="85"
     Margin="0,40,0,0"
     HorizontalAlignment="Stretch"
     VerticalAlignment="Stretch"
     SpaceBetweenItems="35"
     SelectedItem="{Binding DiarySelectedItem.DiarySmileyId}"
     SpaceBetweenSelectedItemAndItems="40"
     ItemClick="ItemView_ItemClick"
     ItemTemplate="{StaticResource 50ItemTemplate}"
     ItemsSource="{Binding DiarySmileyIdOC}" 
     SelectedItemChanged="CoverFlow_SelectedItemChanged" />

//
///设置并获取DiarySelectedItem属性。
///更改该属性的值将引发PropertyChanged事件。
/// 
公共日志项详细日志选择项
{
获取{return\u diarySelectedItem;}
设置
{
如果(_diarySelectedItem==值)
{
返回;
}
_diarySelectedItem=值;
RaisePropertyChanged(DiarySelectedItemPropertyName);
}
}
/// 
///获取或设置日记笑脸Id可观察集合。
/// 
/// 
///《微笑日记》是可观察的收藏。
/// 
公共可观测收集日记
{
获取{return\u diarySmileyIdOC;}
设置
{
if(_diarySmileyIdOC==值)
{
返回;
}
_diarySmileyIdOC=值;
//更新绑定,无广播
RaisePropertyChanged(DiarySmileyIdOCPropertyName);
}
}

由于您要将
可观察集合
绑定到
项目资源
SelectedItem
也是
int
。通过绑定到
DiarySelectedItem.DiarySmileyId
而不是直接绑定到
DiarySelectedItem
,您已经考虑到了这一点

这有一个副作用,即您实际上并没有更改
DiarySelectedItem
,而只是尝试更改其
DiarySmileyId
属性的值。这可能不是您想要的,原因如下:

  • 如果
    DiarySelectedItem
    null
    ,则在分配给
    DiarySelectedItem.DiarySmileyId
    时,由于无提示的
    NullReferenceException
    将不会发生任何事情
  • 如果
    DiarySelectedItem
    不为
    null
    DiaryItemDetail.DiarySmileyId
    具有公共setter,则分配给
    DiarySelectedItem
    的实例中的
    DiarySmileyId
    属性的值将更改,而其他属性将保持不变
  • 如果
    DiarySelectedItem
    不是
    null
    并且
    DiaryItemDetail.diarySmileId
    没有公共setter,则不会发生任何事情,因为无法将
    diarySmileId
    分配给
您应该有一个单独的
DiarySelectedItemId
属性来实现所需的行为:

public DiaryItemDetail DiarySelectedItemId
{
    get { return _diarySelectedItem.DiarySmileyId; }

    set
    {
        if (_diarySelectedItem.DiarySmileyId == value)
        {
            return;
        }

        DiarySelectedItem = GetDairyItemDetail(value); // retrieve instance from repository
        RaisePropertyChanged(DiarySelectedItemIdPropertyName);
    }
}

public DiaryItemDetail DiarySelectedItem
{
    get { return _diarySelectedItem; }

    set
    {
        if (_diarySelectedItem == value)
        {
            return;
        }

        _diarySelectedItem = value;
        RaisePropertyChanged(DiarySelectedItemPropertyName);
        // notification to change the selected item in Coverflow if selected item is changed in code
        RaisePropertyChanged(DiarySelectedItemIdPropertyName);
    }
}

为什么您没有将
observedcollection
设置为
ItemsSource
,这样您就可以将
SelectedItem
直接绑定到
SelectedItem

谢谢Damir。事实上,我想详细说明一下情况。有一个listview,从中选择的字段被设置到此Coverflow控件中。但我不想从Coverflow控件集选择回listview。因此,我直接将所选对象从listview绑定到Coverflow控件。@BalrajSingh我不确定,我正在跟踪您。您的意思是,
DiarySelectedItem
是您在列表视图中选择的项目,您在coverflow中选择该项目是基于此,但您不希望在coverflow中选择项目时更改它?然后,您希望将coverflow中的选定项目设置为哪个属性?实际上,这是一个添加/编辑表单,其项目以listview的形式显示。如果用户选择一个项目,该项目将显示在编辑表单中,并且用户可以在单击“保存”按钮时更改表单中的值,则更改将被保存并反映在listview中。因此,我希望将listview中选定项的值绑定到编辑表单,但在编辑表单值发生更改时,它不应直接反映在listview上。当用户单击“保存”按钮时,应将其反映并保存。我想通过属性绑定来实现这一点。我希望这有助于您理解。@BalrajSingh在本例中,我建议您仍然将
DiarySelectedItem
绑定到listview的选定项,但在其setter中,您将
DiarySmileId
复制到一个单独的
SelectedDairySmileyId
属性。然后将此
SelectedDiaryMileYID
绑定到coverflow的选定项。这样,更改不会立即传播到listview。在
Save
按钮的命令中,您可以将新值从
SelectedDairySmileyId
复制回
DiarySelectedItem
属性
DiaryItemDetail
必须实现
INotifyPropertyChanged
,才能在listview中反映更改。
public DiaryItemDetail DiarySelectedItemId
{
    get { return _diarySelectedItem.DiarySmileyId; }

    set
    {
        if (_diarySelectedItem.DiarySmileyId == value)
        {
            return;
        }

        DiarySelectedItem = GetDairyItemDetail(value); // retrieve instance from repository
        RaisePropertyChanged(DiarySelectedItemIdPropertyName);
    }
}

public DiaryItemDetail DiarySelectedItem
{
    get { return _diarySelectedItem; }

    set
    {
        if (_diarySelectedItem == value)
        {
            return;
        }

        _diarySelectedItem = value;
        RaisePropertyChanged(DiarySelectedItemPropertyName);
        // notification to change the selected item in Coverflow if selected item is changed in code
        RaisePropertyChanged(DiarySelectedItemIdPropertyName);
    }
}