Rad*_*ado 6 c# data-binding wpf xaml
我有一个ComboBox,其属性ItemsSource和SelectedValue绑定到模型.有时,模型需要将所选项目调整为不同的项目,但是当我在模型中执行时,模型值不会反映在视图中,即使正确设置了SelectedValue(使用snoop和SelectionChanged进行检查)事件处理程序).
为了说明问题,这里有一个简单的xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<ComboBox Height="25" Width="120" SelectedValue="{Binding SelectedValue}" SelectedValuePath="Key" ItemsSource="{Binding PossibleValues}" DisplayMemberPath="Value"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是模型:
using System.Collections.Generic;
using System.Windows;
using System.ComponentModel;
namespace WpfApplication1
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
int m_selectedValue = 2;
Dictionary<int, string> m_possibleValues = new Dictionary<int, string>() { { 1, "one" }, { 2, "two" }, { 3, "three" }, {4,"four"} };
public int SelectedValue
{
get { return m_selectedValue; }
set
{
if (value == 3)
{
m_selectedValue = 1;
}
else
{
m_selectedValue = value;
}
PropertyChanged(this, new PropertyChangedEventArgs("SelectedValue"));
}
}
public Dictionary<int, string> PossibleValues
{
get { return m_possibleValues; }
set { m_possibleValues = value; }
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
Run Code Online (Sandbox Code Playgroud)
我预计行为如下:
但是,在#4中,显示"三".为什么?模型中的值更改为1("一"),但视图仍显示3("三").
我通过显式更新SelectionChanged事件处理程序中的绑定目标找到了一种解决方法,但这似乎是错误的.还有另一种方法来实现这一目标吗?
当您选择一个项目时,绑定引擎将更新模型,并将PropertyChanged
在调用属性设置器期间忽略它刚刚更改的属性.如果没有,事情可能会进入无限循环.
系统假定setter不会更改传递的值.这里的解决方法很简单:使用Dispatcher.BeginInvoke()
或设置IsAsync=True
绑定以获得您正在寻找的行为.但是,我个人强烈反对你这样做.不仅因为它引入了一大堆与时间相关的新问题,而且主要是因为它是一个不应该存在的问题的解决方法.
根本不要这样做.它不仅适用于WPF:更改setter的任何内容都可以预期它刚设置的值被正确设置也不会引发异常.更改setter内部的值是违反直觉的,可能会在以后咬你.此外,对于您的应用程序的用户而言,看到组合框忽略其选择可能会非常令人不安.
如果您不喜欢传递的值,则抛出异常并使用Binding.ValidatesOnExceptions
告诉WPF它是预期的.如果您不希望用户选择此值,请不要将其放在列表中.如果由于其他业务规则而无法有条件地使用该项目,请动态过滤列表或应用触发器.
归档时间: |
|
查看次数: |
1428 次 |
最近记录: |