首页 新闻 会员 周边 捐助

WPF Combobox的SelectedItem属性绑定,在viewModel中赋值,构造函数中能刷新,逻辑代码中不刷新

0
悬赏园豆:100 [已解决问题] 解决于 2015-05-22 11:21

SelectedItem属性,在viewModel中绑定SelectedCableName,构造函数中给SelectedCableName赋值,页面Combobox的选中项可以刷新出来。

 

在程序运行过程中,给SelectedCableName赋值,页面Combobox的选中项没有响应,为空。

 

哪位大侠给帮忙看一下,折腾一天多了都 

pkyou的主页 pkyou | 初学一级 | 园豆:98
提问于:2015-05-22 09:50
< >
分享
最佳答案
1

ItemsSource 不同对象吧 或 没有 RaisePropertyChanged("xxx")

收获园豆:100
Yu | 专家六级 |园豆:12990 | 2015-05-22 10:10

SelectedItem 是ItemsSource 集合的一个对象

 

代码:

CableInformation  是ItemsSource 集合

CableInformation = model.GetCableNames(SelectedTransfer.TransferName);
//Set default selected item
SelectedCableName = CableInformation.FirstOrDefault();

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:13

viewModel属性:这样写的,用的OnPropertyChanged 

 private CableInformationClass _selectedCableName=new CableInformationClass();

public CableInformationClass SelectedCableName
{
get { return _selectedCableName; }
set
{
_selectedCableName = value;
OnPropertyChanged("SelectedCableName");
}
}

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:15

@pkyou: 这是构造函数的代码

 

那在程序运行过程中,给SelectedCableName赋值的代码咋样

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:29

@Yu: 那是一个子函数,运行中也是调用的它

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:30

@Yu: combobox 显示的是类的某个属性,这个类其他的属性还要用到的

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:35

@pkyou: CableInformation  是不是发生变化了

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:38

@Yu: 是啊,CableInformation   变了,才要变SelectedCableName,这个会有影响吗?

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:39

@pkyou: CableInformation   也有 OnPropertyChanged("....") 吧

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:42

@Yu: 有的,会冲突?

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:43

@pkyou: 你把combobox的页面代码贴出来

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:45

@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 | 园豆:98 (初学一级) | 2015-05-22 10:46

@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 | 园豆:98 (初学一级) | 2015-05-22 10:47

@pkyou: 你把 DisplayMemberPath="CableName" 去掉 试试

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:56

@Yu: 去掉以后 显示 命名空间+类名

pkyou | 园豆:98 (初学一级) | 2015-05-22 10:58

@pkyou: 在那个类重写 ToString

 

return CableName;

Yu | 园豆:12990 (专家六级) | 2015-05-22 10:59

@Yu: 这样做就是实现了 DisplayMemberPath 的功能。不过可以试试

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:01

@Yu: 再搞不定就只能换控件了~ 好伤心

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:04

@pkyou: 不会的

Yu | 园豆:12990 (专家六级) | 2015-05-22 11:05

@Yu: 

private void GetCableNames()
        {
            CableInformation = model.GetCableNames(SelectedTransfer.TransferName);
            //Set default selected item
            SelectedCableName = CableInformation.FirstOrDefault(x => x.CableName == CableInformation.FirstOrDefault().CableName);
        }
pkyou | 园豆:98 (初学一级) | 2015-05-22 11:11

@Yu: 改成这样子可以用了 ~~ 看代码里 效果应该是一样的啊 

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:13

@Yu: 就是显示了集合里边的第一个值。为null时候另加处理

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:15

@pkyou: ToString 重写了

Yu | 园豆:12990 (专家六级) | 2015-05-22 11:15

@Yu: 没有重写。 重写ToString的效果跟加上 DisplayMemberPath 效果是一样的。现在能用的是没有重写ToString,XMAL文件里有DisplayMemberPath 属性

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:17

@pkyou: 如果不想重写,可以试试在 CableName 里面也要实现 OnPropertyChanged("CableName")

Yu | 园豆:12990 (专家六级) | 2015-05-22 11:17

@Yu: 太感激了! 第一个提问就遇到您这么耐心的! 跪谢!

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:19

@pkyou: 园内提问,是个好地方

Yu | 园豆:12990 (专家六级) | 2015-05-22 11:22

@Yu: 确实很带劲! 新手,要多多学习!

pkyou | 园豆:98 (初学一级) | 2015-05-22 11:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册