更改数据模板的数据上下文清除组合框选择

时间:2012-03-22 17:01:27

标签: c# wpf

我有一个允许用户选择不同项目的TreeView。使用DataType将DataType设置为相应的ViewModel类型来确定每个项目的显示。 DataContext将根据树视图中的选定项自动设置为相应的ViewModel。

问题在于:

其中一个DataTemplates有一个绑定到ObservableCollection的ComboBox来获取项目列表,以及一个用于在ViewModel中获取/设置SelectedValue的属性。

当我选择此类型的一个项目,然后选择相同类型的另一个项目时,ComboBox显示空白而不是正确的选定项目。在转换到新项目之后,组合框似乎立即将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

任何人对解决方案有任何想法吗?

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,这里会发生一些事情。

首先,您没有在绑定中设置Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

其次,只有值本身发生变化时,属性绑定才会更新。

查看Data Binding

答案 1 :(得分:1)

我想出了一个解决方法,但它不是完全我想要的。

我将绑定更改为使用SelectedItem而不是SelectedValue,并且不会发生此问题。

我从这个question得到了这个想法。

所以我改变了

SelectedValue="{Binding SelectedValue}" 

到(并重命名我的ViewModel属性):

SelectedItem="{Binding SelectedItem}"

在ViewModel中更新此属性的使用后,一切正常。