簡體   English   中英

WPF ComboBox綁定到初始加載時的對象

[英]WPF ComboBox Binding To Object On Initial Load

我有一個綁定到模型對象列表的組合框。 我已將組合框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"
                                         />

@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。

不要從構造函數中調用您的IntializeValuesFromConfiguration ,而是在加載視圖之后。

實現此目的的一種方法是在viewmodel中創建一個運行此方法的命令,然后在加載的事件中調用該命令。 使用MVVM light工具包,您可以使用EventToCommand行為...不知道您正在使用的mvvm框架,但可能會有這樣的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM