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

标签 c# wpf

我有一个允许用户选择不同项目的 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/

相关文章:

c# - 如何首先在代码中或使用 ColumnBuilder 将 ROWGUIDCOL 属性指定为 Guid 类型的列?

c# - 验证是否安装了 Visual C++ 2008 SP1 Redistributable Package 而不在 Windows 注册表中搜索?

wpf - 是否有WPF的全景控件

wpf - 如何更改 Xaml AppBarButton (Windows UWP) 的标签位置

WPF:如何防止 ComboBox 作为 ToggleButton 触发 CheckBox.Checked 事件?

javascript - 使用 Fluent nhibernate 的级联下拉列表 MVC5

c# - 部分中的 BeginCollectionItem 部分行为不正确

c# - WCF的DataContractSerilaizer线程安全吗?

.net - 使用 MVVM 模式在 WPF 中传递和保留连接字符串?

c# - 什么时候调用 CanExecute?