SelectedItem属性,在viewModel中绑定SelectedCableName,构造函数中给SelectedCableName赋值,页面Combobox的选中项可以刷新出来。
在程序运行过程中,给SelectedCableName赋值,页面Combobox的选中项没有响应,为空。
哪位大侠给帮忙看一下,折腾一天多了都
ItemsSource 不同对象吧 或 没有 RaisePropertyChanged("xxx")
SelectedItem 是ItemsSource 集合的一个对象
代码:
CableInformation 是ItemsSource 集合
CableInformation = model.GetCableNames(SelectedTransfer.TransferName);
//Set default selected item
SelectedCableName = CableInformation.FirstOrDefault();
viewModel属性:这样写的,用的OnPropertyChanged
private CableInformationClass _selectedCableName=new CableInformationClass();
public CableInformationClass SelectedCableName
{
get { return _selectedCableName; }
set
{
_selectedCableName = value;
OnPropertyChanged("SelectedCableName");
}
}
@pkyou: 这是构造函数的代码
那在程序运行过程中,给SelectedCableName赋值的代码咋样
@Yu: 那是一个子函数,运行中也是调用的它
@Yu: combobox 显示的是类的某个属性,这个类其他的属性还要用到的
@pkyou: CableInformation 是不是发生变化了
@Yu: 是啊,CableInformation 变了,才要变SelectedCableName,这个会有影响吗?
@pkyou: CableInformation 也有 OnPropertyChanged("....") 吧
@Yu: 有的,会冲突?
@pkyou: 你把combobox的页面代码贴出来
@Yu: 注释掉的是事件
<ComboBox Grid.Column="3" ItemsSource="{Binding Path=CableInformation}" Name="CableNameComboBox"
SelectedItem="{Binding Path=SelectedCableName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="CableName"
>
<!--<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding CableNameChanged}"
CommandParameter="{Binding SelectedValue, ElementName=CableNameComboBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>-->
</ComboBox>
@Yu:
<ComboBox Grid.Column="3" ItemsSource="{Binding Path=CableInformation}" Name="CableNameComboBox" SelectedItem="{Binding Path=SelectedCableName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="CableName" > <!--<i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding CableNameChanged}" CommandParameter="{Binding SelectedValue, ElementName=CableNameComboBox}"/> </i:EventTrigger> </i:Interaction.Triggers>--> </ComboBox>
@pkyou: 你把 DisplayMemberPath="CableName" 去掉 试试
@Yu: 去掉以后 显示 命名空间+类名
@pkyou: 在那个类重写 ToString
return CableName;
@Yu: 这样做就是实现了 DisplayMemberPath 的功能。不过可以试试
@Yu: 再搞不定就只能换控件了~ 好伤心
@pkyou: 不会的
@Yu:
private void GetCableNames() { CableInformation = model.GetCableNames(SelectedTransfer.TransferName); //Set default selected item SelectedCableName = CableInformation.FirstOrDefault(x => x.CableName == CableInformation.FirstOrDefault().CableName); }
@Yu: 改成这样子可以用了 ~~ 看代码里 效果应该是一样的啊
@Yu: 就是显示了集合里边的第一个值。为null时候另加处理
@pkyou: ToString 重写了
@Yu: 没有重写。 重写ToString的效果跟加上 DisplayMemberPath 效果是一样的。现在能用的是没有重写ToString,XMAL文件里有DisplayMemberPath 属性
@pkyou: 如果不想重写,可以试试在 CableName 里面也要实现 OnPropertyChanged("CableName")
@Yu: 太感激了! 第一个提问就遇到您这么耐心的! 跪谢!
@pkyou: 园内提问,是个好地方
@Yu: 确实很带劲! 新手,要多多学习!