假设我有四个组合框(让我们称之为cbA1,cbA2,cbB1,cbB2),cbA1和cbB1绑定到同一属性,cbA2和cbB2绑定到我的viewmodel中的不同属性。在我切换到MVVM之前,我有一些代码隐藏,确保cbA1和cbB1中的相同值不相同。他们使用枚举作为项目源。
你必须忽略我现在有这么多组合框显示数据的原因。我偶然偶然发现了这件事。
这是在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的值是正确的。
虽然我最终会删除重复的组合框,但我所关注的不是更新的事实是最大的问题。
答案 0 :(得分: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
}
}