我有一个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
}
答案 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
}