代码之家  ›  专栏  ›  技术社区  ›  TuanDT

如果我们使用表达式交互ChangepropertyAction,XAML中的双向绑定不会更新源代码

  •  0
  • TuanDT  · 技术社区  · 7 年前

    我遇到了一个场景,在这个场景中,我必须更新WPF项目中的源数据对象,而不需要任何代码延迟(严格来说,仅限于XAML更改)。描述如下:我有两个文本框,分别称为员工的姓名和职务。

    Employee.cs:

    public class Employee : INotifyPropertyChanged
    {
        private string name;
        public string Name {
            get { return name; }
            set
            {
                name = value;
                if(PropertyChanged != null)
                {
                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }
    
        private string title;
        public string Title {
            get { return title; }
            set
            {
                title = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Title"));
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public static Employee GetEmployee()
        {
            var emp = new Employee()
            {
                Name = "Ali Ahmed",
                Title = "Developer"
            };
            return emp;
        }
    }
    

    windows类如下所示:

    public partial class MainWindow : Window
        {
            Employee employee = Employee.GetEmployee();
            public MainWindow()
            {
                InitializeComponent();
                DataContext = employee;
            }
    
            private void OnNameChanged(object sender, RoutedEventArgs e)
            {
                TextBox castedTextBox = sender as TextBox;
                employee.Title = castedTextBox.Text;
            }
        }
    

    注意 OnNameChanged 处理程序将员工的头衔设置为其姓名的字符串(模拟实际项目中不需要的bug)

    XAML代码:

    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            xmlns:i = "http://schemas.microsoft.com/expression/2010/interactivity" 
            xmlns:ei = "http://schemas.microsoft.com/expression/2010/interactions" 
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <CheckBox x:Name="checkBox" Content="CheckBox" HorizontalAlignment="Left" Height="21" Margin="59,39,0,0" VerticalAlignment="Top" Width="89"/>
            <ComboBox HorizontalAlignment="Left" Height="25" Margin="59,72,0,0" VerticalAlignment="Top" Width="179" />
            <TextBox HorizontalAlignment="Left" x:Name="TitleTextBox" Height="21" Margin="60,113,0,0" TextWrapping="Wrap" Text="{Binding Title, Mode=TwoWay}" VerticalAlignment="Top" Width="178">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="TextChanged">
                        <ei:ChangePropertyAction TargetName="TitleTextBox" TargetObject="{Binding ElementName=TitleTextBox}" PropertyName="Text" Value=""/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
            <TextBox HorizontalAlignment="Left" Height="24" Margin="60,146,0,0" TextWrapping="Wrap" Text="{Binding Name, Mode=TwoWay}" TextChanged="OnNameChanged" VerticalAlignment="Top" Width="178"/>
            <TextBlock HorizontalAlignment="Left" Height="27" Margin="59,180,0,0" TextWrapping="Wrap" Text="{Binding Name, Mode=OneWay}" VerticalAlignment="Top" Width="179"/>
            <TextBlock HorizontalAlignment="Left" Height="27" Margin="60,221,0,0" TextWrapping="Wrap" Text="{Binding Title, Mode=OneWay}" VerticalAlignment="Top" Width="179"/>
    
        </Grid>
    </Window>
    

    这个XAML代码唯一重要的一点是在 TitleTextBox . 这段交互XAML代码的意图和目的是删除title文本框,希望双向绑定也会删除错误设置的员工的title值 OnNameChanged

    我的问题:我可以在XAML上做些什么吗 单独地 (因为这是我必须处理的一个特定约束)这会迫使模型识别标题框中的更改并更新Employee对象吗?

    0 回复  |  直到 7 年前
    推荐文章