2013-06-04 109 views
-1

我有一個wpf組合框綁定到類SInstance的屬性LogicalP。組合框的ItemSource是一個包含LogicalP類型項目的字典。WPF Combobox初始字典綁定值沒有顯示

如果我將SInstance中的LogicalP設置爲初始狀態,則組合框文本字段顯示爲空。如果我選擇下拉列表,我所有的字典值都在那裏。當我在SInstance中更改選擇LogicalP時會正確更新。如果我在C#中更改Sinstance,則相應的組合框值不會反映從下拉菜單中更新的LogicalP。

我已經將綁定模式設置爲twoway而沒有運氣。有什麼想法嗎?

我的XAML:

<UserControl.Resources> 
<ObjectDataProvider x:Key="PList" 
        ObjectType="{x:Type src:MainWindow}" 
        MethodName="GetLogPList"/> 
</UserControl.Resources> 

<DataTemplate DataType="{x:Type src:SInstance}"> 
<Grid> 
    <ComboBox ItemsSource="{Binding Source={StaticResource PList}}" 
       DisplayMemberPath ="Value.Name" 
       SelectedValuePath="Value" 
      SelectedValue="{Binding Path=LogicalP,Mode=TwoWay}"> 
    </ComboBox> 
</Grid> 
</DataTemplate> 

我的C#:

public Dictionary<string, LogicalPType> LogPList { get; private set; } 
public Dictionary<string, LogicalPType> GetLogPList() 
{ 
    return LogPList; 
} 

public class LogicalPType 
{ 
    public string Name { get; set; } 
    public string C { get; set; } 
    public string M { get; set; } 
}     

public class SInstance : INotifyPropertyChanged 
{ 
    private LogicalPType _LogicalP; 

    public string Name { get; set; } 
    public LogicalPType LogicalP 
    { 
     get { return _LogicalP; } 
     set 
     { 
      if (_LogicalP != value) 
      { 
       _LogicalP = value; 
       NotifyPropertyChanged("LogicalP"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 
    #endregion 
}  

回答

0

他們不是在看相同的源。
您需要讓SInstance同時提供LogPList和LogicalP。如果你想不同的對象來比較平等的,那麼你需要重載Equals

_LogicalP沒有連接到LogPList

+0

我不知道你是否理解這個問題。當我更改組合框上的選擇時,基礎綁定對象(SInstance)被更新,它保持空白。 但是,當我更改SInstance中的屬性時,Combobox不會更新以反映所選項目。 – user2367856

+0

是的,我明白。顯示如何爲C#中的LogicalP賦值。 – Paparazzi

+0

對不起,我沒有在主窗體加載中顯示LogPList字典的代碼。我確實找到了解決這個問題的方法,這個方案可以讓綁定變成雙向的。我會將其修改爲原始文章。 – user2367856

0

這是我的工作解決方案。通過將字典檢索GetLogPList移動​​到與提供數據相同的類(如Blam所建議的),我能夠使綁定以雙向方式工作。我改變綁定到一個列表,而不是一本字典,以簡化組合框

下面是更新XAML中顯示新的ItemsSource綁定和去除SelectedValuePath的:

<DataTemplate DataType="{x:Type src:SInstance}"> 
    <Grid> 
     <ComboBox ItemsSource="{Binding GetLogPList}" 
        DisplayMemberPath ="Name" 
       SelectedValue="{Binding Path=LogicalP,Mode=TwoWay}"> 
     </ComboBox> 
    </Grid> 
</DataTemplate> 

我再變字典LogPList爲靜態,這樣它可以被類SInstance訪問:

public static Dictionary<string, LogicalPType> LogPList { get; private set; } 

最後,我將GetLogPList作爲屬性移動到類SInstance。再次注意它是返回一個列表,而不是字典,使Xaml更簡單一些:

public class SInstance : INotifyPropertyChanged 
{ 
    public List<LogicalPType> GetLogPList 
    { 
     get { return MainWindow.LogPList.Values.ToList(); } 
     set { } 
    } 

    private LogicalPType _LogicalP; 

    public string Name { get; set; } 
    public LogicalPType LogicalP 
    { 
     get { return _LogicalP; } 
     set 
     { 
      if (_LogicalP != value) 
      { 
       _LogicalP = value; 
       NotifyPropertyChanged("LogicalP"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 
    #endregion 
}