将数据绑定到WPF UserControl

时间:2014-11-07 11:54:53

标签: c# .net wpf xaml mvvm

我创建了以下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)
        {

        }
    }

现在,您可以告诉我错过了在TwoWay模式下将文件背后的代码属性绑定到UI的重要事项。

虽然这不是MVVM方式..

2 个答案:

答案 0 :(得分:2)

向您的控件添加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); }
}

答案 1 :(得分:1)

当您使用usercontrol的 DataContext 具有所有属性IsChecked,EventId,MethodName,...时,您可以从usercontrol中删除属性并且所有属性都可以。

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

顺便说一下,当您在WPF中使用Binding时,它的所有内容都是正确的 DataContext 和正确的 BindingExpression