WPF ComboBox绑定到初始加载时的对象

时间:2011-03-16 20:55:13

标签: c# wpf data-binding mvvm combobox

我有一个绑定到模型对象列表的组合框。我已将组合框SelectedItem绑定到作为模型类型的属性。加载窗口后,我的所有数据绑定都能很好地工作。 SelectedItem设置正确,我可以直接使用存储库保存对象。

问题是当窗口第一次加载时我初始化SelectedItem属性而我的组合框没有显示任何内容。在我移动到绑定到对象之前,我绑定到一个字符串列表,并且在初始化时工作得很好。我知道我错过了什么,但我无法理解。

提前感谢您提供的任何指导。

(关于此页面布局的一个注释。组合框实际上是ListView中使用的另一个ItemTemplate的一部分.ListView绑定到主MV中的一个可观察集合。这个可观察集合的每个项目本身一个ModelView。它是第二个具有SelectedItem属性的ModelView。)

这是我的模特:

    public class DistributionListModel : Notifier, IComparable
    {
    private string m_code;
    private string m_description;

    public string Code
    {
        get { return m_code; }
        set { m_code = value; OnPropertyChanged("Code"); }
    }

    public string Name
    {
        get { return m_description; }
        set { m_description = value; OnPropertyChanged("Name"); }
    }

    #region IComparable Members

    public int CompareTo(object obj)
    {
        DistributionListModel compareObj = obj as DistributionListModel;
        if (compareObj == null)
            return 1;

        return Code.CompareTo(compareObj.Code);
    }

    #endregion
}

这里是我的ModelView中的相关代码:

public MailRoutingConfigurationViewModel(int agencyID)
    : base()
{
    m_agencyID = agencyID;
    m_agencyName = DataManager.QueryEngine.GetAgencyName(agencyID);

    IntializeValuesFromConfiguration(DataManager.MailQueryEngine.GetMailRoutingConfiguration(agencyID));

    // reset modified flag
    m_modified = false;
}

private void IntializeValuesFromConfiguration(RecordCheckMailRoutingConfiguration configuration)
{
    SelectedDistributionList = ConfigurationRepository.Instance.GetDistributionListByCode(configuration.DistributionCode);
}

public DistributionListModel SelectedDistributionList
{
    get { return m_selectedDistributionList; }
    set
    {
        m_selectedDistributionList = value;
        m_modified = true;
        OnPropertyChanged("SelectedDistributionList");
    }

}

最后是相关的XAML:

<UserControl.Resources>
        <DataTemplate x:Key="DistributionListTemplate">
            <Label Content="{Binding Path=Name}" />
        </DataTemplate>
</UserControl.Resources>
              <ComboBox 
                       ItemsSource="{Binding Source={StaticResource DistributionCodeViewSource}, Mode=OneWay}"
                       ItemTemplate="{StaticResource DistributionListTemplate}"
                                        SelectedItem="{Binding Path=SelectedDistributionList, Mode=TwoWay}"
                        IsSynchronizedWithCurrentItem="False"
                                         />

2 个答案:

答案 0 :(得分:9)

@SRM,如果我理解正确你的问题是将你的comboBox绑定到一个对象集合而不是一组值类型(比如string或int-尽管string不是值类型)。 我建议在你的组合框上添加两个属性

<ComboBox 
  ItemsSource="{Binding Source={StaticResource DistributionCodeViewSource}, 
                        Mode=OneWay}"                        
  ItemTemplate="{StaticResource DistributionListTemplate}"
  SelectedItem="{Binding Path=SelectedDistributionList, Mode=TwoWay}"
  SelectedValuePath="Code"  
  SelectedValue="{Binding SelectedDistributionList.Code }"/>

我在这里假设DistributionListModel对象由其代码标识。 我添加了SelectedValuePath和SelectedValue的两个属性帮助组合框识别用于标记的属性,通过组合框内的弹出控件选择ComboBoxItem。 对于TextBox,ItemSource和SelectedValue使用SelectedValuePath。

答案 1 :(得分:1)

不要从构造函数中调用IntializeValuesFromConfiguration,而是在加载视图之后调用。{/ p>

实现此目的的一种方法是在viewmodel中创建一个运行此方法的命令,然后在加载的事件中调用该命令。 使用MVVM light工具包,您可以使用EventToCommand行为...不知道您正在使用的mvvm框架,但可能会有类似的东西。