0

假设我有四个组合框(我们称之为 cbA1、cbA2、cbB1、cbB2),cbA1 和 cbB1 绑定到相同的属性,而 cbA2 和 cbB2 绑定到我的视图模型中的不同属性。在我切换到 MVVM 之前,我有一些代码隐藏,以确保相同的值在 cbA1 和 cbB1 中不同。他们使用枚举作为 itemssource。

您将不得不忽略为什么我现在有这么多组合框显示数据的原因。我只是偶然偶然发现了这一点。

这是它们在 XAML 中的构造方式:

<ComboBox 
    x:Name"cbA1"
    DisplayMemberPath="Description" 
    SelectedValuePath="Value" 
    SelectedValue="{Binding Window1Page}" 
    ItemsSource="{Binding Source={local:Enumeration {x:Type Enum:eDisplayPages}}}"/>  
<ComboBox 
    x:Name"cbA2"
    DisplayMemberPath="Description" 
    SelectedValuePath="Value" 
    SelectedValue="{Binding Window2Page}" 
    ItemsSource="{Binding Source={local:Enumeration {x:Type Enum:eDisplayPages}}}"/>

因此,当我运行应用程序时,#1 组合框显示来自 Window1Page 的数据,而#2 组合框显示来自 Window2Page 的数据。我的旧代码隐藏检查以确保 #1 组合框中的内容不能出现在 #2 组合框中。这是一种享受。现在我正在迁移到 MVVM 模型,我已经将代码移动到属性本身进行检查。这是属性之一:

    public eDisplayPages Window1Page
    {
        get { return _window1page; }
        set
        {
            if (_window1page == value)
                return;

            if ((value.Equals(_window2page)) && (value != eDisplayPages.NoDashPage))
            {
                //Can't have them both selecting the same page
                value = eDisplayPages.NoDashPage;
            }

            SetProperty(ref _window1page, value);
        }
    }

虽然这里不是真正相关的是帮助您可视化问题的枚举:

public enum eDisplayPages
{
    [Description("NO Layout")]
    NoDashPage = 0,
    [Description("Main Layout")]
    MainDashPage,
    [Description("Timing Layout")]
    TimingOnlyDashPage
}

所以我看到的问题是,当我将 cbA1 更改为与 cbA2 相同的值时,属性代码会运行并将值更改为默认的“NoDashPage”,但它只会更新我没有进行更改的组合框中,在这种情况下为 cbB1。

用于更改我关注的组合框以及其他组合框的旧代码隐藏方法。唯一的区别是我曾经将焦点组合框的 SelectedValue 设置为新值,这确实更新了另一个组合框。

我不明白为什么它不更改我在其中进行初始选择的组合框。如果我进入调试器,则 Window1Page 的值是正确的。

虽然我最终会删除重复的组合框,但我关注的组合框没有更新是最大的问题。

4

1 回答 1

0

if语句在我看来看起来不自然,为什么要更改(保留)value变量?

public eDisplayPages Window1Page
{
    get { return _window1page; }
    set
    {
        if (_window1page == value)
            return;

        if ((value.Equals(_window2page)) && (value != eDisplayPages.NoDashPage))
        {
            //Can't have them both selecting the same page
            _window1page = eDisplayPages.NoDashPage;
        }
        else
        {
            _window1page = value;
        }
        //TODO: add some change notification here
    }
}
于 2013-05-05T18:31:55.557 回答