WPF Combobox初始字典绑定值未显示

时间:2013-06-04 17:33:16

标签: wpf xaml binding dictionary combobox

我有一个wpf组合框绑定到类SInstance的属性LogicalP。组合框的ItemSource是一个包含LogicalP类型项的字典。

如果我将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
}    

2 个答案:

答案 0 :(得分:0)

他们没有看同一个来源 您需要让SInstance同时提供LogPList和LogicalP。

_LogicalP未连接到LogPList

如果您想要将不同的对象进行比较,那么您需要覆盖等于。

答案 1 :(得分: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
}