WPF与主视图布局绑定

时间:2016-06-06 11:38:58

标签: wpf binding master-detail

我有一个关于使用主从细节布局的WPF绑定的问题。

主视图包含带有TreeListView的DevExpress GridControl。 更改TreeListView选定项目时(通过绑定)更新详细视图内容。 详细视图只包含一个ContentControl,其Content属性绑定到TreeListView的当前所选项。 为了以与所选项的类型相对应的方式显示详细视图,将多个DataTemplates注册到当前应用程序资源。 就我而言,DataTemplates只是一个用户控件。

当在主视图TreeListView中更改选择时,相应的DataTemplate被正确地显示。

我的一个详细视图包含一个DevExpress ListBoxEdit。 SelectedIndex与UpdateSourceTrigger = PropertyChanged绑定。

我的问题是,当在主视图中选择另一个项目时,将使用值-1调用bound属性的setter。 当控件被卸载或处理或解除绑定时,似乎接收到-1默认值。这搞砸了我的视图模型。

是否有正确的方法可以避免在卸载控件时在ViewModel中收到通知?

[更新] 包含详细信息视图的ContentControl定义如下:

<ContentControl Grid.Column="1" Content="{Binding CurrentApplicationSettings}" Margin="10,0,0,0"/>

在相应的视图模型中(SetValue方法调用OnPropertyChanged):

public IApplicationSettingsViewModel CurrentApplicationSettings
{
    get { return GetValue<IApplicationSettingsViewModel>(); }
    set { SetValue(value); }
}

在我遇到问题的详细视图中,ListBoxEdit的定义如下:

<dxe:ListBoxEdit ShowBorder="False" ItemsSource="{Binding AllLoggingLevels, Mode=OneTime}" SelectedIndex="{Binding Path=LoggingLevel, Mode=TwoWay, Converter={StaticResource LogLevelConverter}, UpdateSourceTrigger=PropertyChanged}">
    <dxe:ListBoxEdit.StyleSettings>
        <dxe:RadioListBoxEditStyleSettings/>
    </dxe:ListBoxEdit.StyleSettings>
</dxe:ListBoxEdit>

在相应的ViewModel中:

public LoggingLevel LoggingLevel
{
    get { return GetValue<LoggingLevel>(); }
    set { SetValue(value); }
}

DataTemplates由代码注册:

public void RegisterDataTemplate(DataTemplate dataTemplate)
{
    object dataTemplateKey = dataTemplate.DataTemplateKey;
    if (dataTemplateKey == null)
    {
        throw new InvalidOperationException("The data template has an invalid key");
    }
    System.Windows.Application.Current.Resources.Add(dataTemplateKey, dataTemplate);
}

非常感谢你 菲利普

1 个答案:

答案 0 :(得分:0)

我收到了DevExpress支持的回复,这对我有用。

“研究过后,我发现由于内部编辑器的同步而发生这种情况。当编辑器因为更改树中的焦点行而丢失其项目源时,它会重置其属性,如EditValue,Text,SelectedItem,等

要防止同步这些属性,请将编辑器的 AllowUpdateTwoWayBoundPropertiesOnSynchronization 属性设置为false。“