C# CoverFlow控件的数据绑定选定项属性?
我正在使用 我正在尝试将此控件的selected Item属性绑定到一个属性,但没有任何效果。下面是我正在使用的代码,请让我知道我犯了什么错误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=
<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
具有公共setter,则分配给DiaryItemDetail.DiarySmileyId
的实例中的DiarySelectedItem
属性的值将更改,而其他属性将保持不变DiarySmileyId
- 如果
不是DiarySelectedItem
并且null
没有公共setter,则不会发生任何事情,因为无法将DiaryItemDetail.diarySmileId
分配给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);
}
}