正在将数据绑定到WPF UserControl

本文关键字:WPF UserControl 数据绑定 | 更新日期: 2023-09-27 18:29:37

我创建了以下GridRow作为UserControl

<UserControl x:Class="Project.Telematics_Plugin.GridRow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" BorderBrush="LightBlue"
             MaxHeight="30" MinWidth="900">
    <Grid>
        <StackPanel  Orientation="Horizontal">
            <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsChecked}" />
            <TextBox Width="60" Text="{Binding EventId}"/>
            <TextBox Width="300" Text="{Binding MethodName}" />
            <ComboBox  Width="200" ItemsSource="{Binding }" />
            <ComboBox Width="200"/>
            <ComboBox Width="200"/> 
            <Button Click="OnClickEdit">
                <Image Source="Images/edit.png"/>
            </Button>
            <Button Click="OnClickDelete">
                <Image Source="Images/delete.png"/>
            </Button>
        </StackPanel>
    </Grid>
</UserControl>

这是背后的代码

public partial class GridRow : UserControl
    {
        public bool IsChecked { get; set; }
        public int EventId { get; set; }
        public string MethodName { get; set; }
        public string Level { get; set; }
        public string Opcode { get; set; }
        public string Task { get;set; }
        public string Keyword { get; set; }
        public GridRow()
        {
            InitializeComponent();

        }
        private void OnClickEdit(object sender, RoutedEventArgs e)
        {
        }
        private void OnClickDelete(object sender, RoutedEventArgs e)
        {
        }
    }

现在,你能告诉我在双向模式中将代码隐藏文件的属性绑定到UI时错过了什么重要的事情吗。。

尽管这不是MVVM的方式。。

正在将数据绑定到WPF UserControl

x:Name添加到控件并使用ElementName:绑定到属性

<UserControl x:Name="MyGridRow">
    <Grid>
        <StackPanel  Orientation="Horizontal">
            <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsChecked, ElementName=MyGridRow}" />
            <TextBox Width="60" Text="{Binding EventId, ElementName=MyGridRow}"/>
            <TextBox Width="300" Text="{Binding MethodName, ElementName=MyGridRow}" />
            <ComboBox  Width="200" ItemsSource="{Binding Path=., ElementName=MyGridRow}" />
            <ComboBox Width="200"/>
            <ComboBox Width="200"/> 
            <Button Click="OnClickEdit">
                <Image Source="Images/edit.png"/>
            </Button>
            <Button Click="OnClickDelete">
                <Image Source="Images/delete.png"/>
            </Button>
        </StackPanel>
    </Grid>
</UserControl>

如果你想支持更新值,你应该使用DependencyProperties而不是普通属性:

public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(GridRow));
public bool IsChecked
{
    get { return (bool)GetValue(IsCheckedProperty); }
    set { GetValue(IsCheckedProperty, value); }
}

当您使用用户控件的DataContext具有所有属性IsChecked、EventId、MethodName…时,。。。,然后,您可以从用户控件中删除这些属性,并且所有工作都可以完成。

但是,如果你想创建一个"真正的"用户控件,那么你应该使用DependencyProperty并将它们与用户控件中的正确表达式绑定。

顺便说一句,当你在WPF中使用Binding时,它都是关于右边的DataContext和右边的BindingExpression