我有一个允许用户选择不同项目的 TreeView。每个项目的显示是使用数据模板确定的,并将 DataType 设置为适当的 ViewModel 类型。 DataContext 会根据 TreeView 中的所选项目自动设置为适当的 ViewModel。
问题是这样的:
其中一个 DataTemplates 有一个绑定(bind)到 ObservableCollection 的 ComboBox 来获取项目列表,以及一个属性来获取/设置 ViewModel 中的 SelectedValue。
当我选择此类型的一个项目,然后选择相同类型的另一项目时,组合框显示空白而不是正确的选定项目。看起来组合框在转换到新项目后立即将 SelectedValue 属性设置为 NULL,然后不再更新。
<ComboBox Margin="1,0"
ItemsSource="{Binding ItemsToSelect}"
SelectedValue="{Binding SelectedValue}"
SelectedValuePath="ValuePath" DisplayMemberPath="DisplayPath"
IsEnabled="{Binding CanSelectItem}">
</ComboBox>
真正奇怪的部分是,如果我在选择相同类型的项目之间选择不同类型的项目,它总是显示正确。
我尝试忽略 SelectedValue setter 中的 NULL 值,无论我是否也引发了 PropertyChanged 事件,这都不起作用。
private MyObject selectedValue;
public MyObject SelectedValue
{
get
{
return selectedValue;
}
set
{
if (value != null)
{
this.selectedValue = value;
}
this.OnPropertyChanged("SelectedValue");
}
}
在编写本文时查看类似的问题使我发现了一个我尚未找到的有趣属性 - IsSynchronizedWithCurrentItem
来自此 question 。起初,我认为这解决了问题,但可惜它只是稍微改变了行为。
将此属性设置为 True
时,组合不会完全清除其选择,而只是将第一个项目标记为选中。因此,现在 SelectedValue 属性被设置为列表中的第一项,而不是设置为 NULL。
有人有解决方案吗?
最佳答案
如果我正确理解你的问题,这里发生了一些事情。
首先,您的绑定(bind)中没有设置 Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
。
其次,属性绑定(bind)仅在值本身发生更改时才会更新。
看看这个 Data Binding
关于c# - 更改数据模板的数据上下文会清除组合框选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826989/