Silverlight 5 在 属性 上的绑定在其 setter 中的逻辑在附加调试时无法按预期工作
Silverlight 5 binding on a property with logic in its setter does not work as expected when debug is attached
我的问题很容易重现。
我使用视图模型从头开始创建了一个项目。
正如您在 "Age" 属性 的 setter 中看到的,我有一个简单的逻辑。
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int age;
public int Age
{
get
{
return age;
}
set
{
/*Age has to be over 18* - a simple condition in the setter*/
age = value;
if(age <= 18)
age = 18;
OnPropertyChanged("Age");
}
}
public MainViewModel(int age)
{
this.Age = age;
}
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在MainPage.xaml
<Grid x:Name="LayoutRoot" Background="White">
<TextBox
Text="{Binding Path=Age, Mode=TwoWay}"
HorizontalAlignment="Left"
Width="100"
Height="25"/>
<TextBlock
Text="{Binding Path=Age, Mode=OneWay}"
HorizontalAlignment="Right"
Width="100"
Height="25"/>
</Grid>
而MainPage.xaml.cs我只是实例化视图模型并将其设置为DataContext。
public partial class MainPage : UserControl
{
private MainViewModel mvm;
public MainPage()
{
InitializeComponent();
mvm = new MainViewModel(20);
this.DataContext = mvm;
}
}
我希望如果在文本框中输入的值低于 18,此代码会将 Age 设置为 18。
场景:在TextBox中插入值“5”并按tab键(绑定生效,TextBox需要失去焦点)
案例 1:已附加调试器 =>
正如预期的那样,TextBox 值将为“5”,TextBlock 值将为“18”。 - 错误
情况 2:未附加调试器 =>
TextBox 值为“18”,TextBlock 值为“18” - 正确
似乎在附加调试器时,绑定在触发 属性 值更新的对象上无法按预期工作。仅当我们绑定的 属性 在 setter 或 getter.
中具有某种逻辑时才会发生这种情况
SL5 是否发生了某些变化,setters 中的逻辑不再被允许?
配置:
VisualStudio 2010 SP1
SL 5 工具 5.1.30214.0
SL5 SDK 5.0.61118.0
浏览器 10
我的问题很容易重现。 我使用视图模型从头开始创建了一个项目。 正如您在 "Age" 属性 的 setter 中看到的,我有一个简单的逻辑。
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int age;
public int Age
{
get
{
return age;
}
set
{
/*Age has to be over 18* - a simple condition in the setter*/
age = value;
if(age <= 18)
age = 18;
OnPropertyChanged("Age");
}
}
public MainViewModel(int age)
{
this.Age = age;
}
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在MainPage.xaml
<Grid x:Name="LayoutRoot" Background="White">
<TextBox
Text="{Binding Path=Age, Mode=TwoWay}"
HorizontalAlignment="Left"
Width="100"
Height="25"/>
<TextBlock
Text="{Binding Path=Age, Mode=OneWay}"
HorizontalAlignment="Right"
Width="100"
Height="25"/>
</Grid>
而MainPage.xaml.cs我只是实例化视图模型并将其设置为DataContext。
public partial class MainPage : UserControl
{
private MainViewModel mvm;
public MainPage()
{
InitializeComponent();
mvm = new MainViewModel(20);
this.DataContext = mvm;
}
}
我希望如果在文本框中输入的值低于 18,此代码会将 Age 设置为 18。 场景:在TextBox中插入值“5”并按tab键(绑定生效,TextBox需要失去焦点)
案例 1:已附加调试器 => 正如预期的那样,TextBox 值将为“5”,TextBlock 值将为“18”。 - 错误
情况 2:未附加调试器 => TextBox 值为“18”,TextBlock 值为“18” - 正确
似乎在附加调试器时,绑定在触发 属性 值更新的对象上无法按预期工作。仅当我们绑定的 属性 在 setter 或 getter.
中具有某种逻辑时才会发生这种情况SL5 是否发生了某些变化,setters 中的逻辑不再被允许?
配置: VisualStudio 2010 SP1 SL 5 工具 5.1.30214.0 SL5 SDK 5.0.61118.0 浏览器 10