Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数据绑定到UserControl_C#_Wpf_Datagrid_User Controls - Fatal编程技术网

C# 如何将数据绑定到UserControl

C# 如何将数据绑定到UserControl,c#,wpf,datagrid,user-controls,C#,Wpf,Datagrid,User Controls,我有一个带有按钮、文本块和数据网格的my UserControl: <UserControl x:Class="WpfApplication1.DataGridControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="

我有一个带有按钮、文本块和数据网格的my UserControl:

<UserControl x:Class="WpfApplication1.DataGridControl"
         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">
<Grid Background="Red">
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding Path=RowHeight}"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Path=ColumnWidth}"></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Button Name="MinimizeButton"
            Grid.Row="0"
            Grid.Column="0"
            Height="{Binding Path=RowHeight}"
            Width="{Binding Path=ColumnWidth}"
            Click="MinimizeButton_Click">
    </Button>

    <TextBlock Name="SuitNameTextBlock"
               Grid.Row="0"
               Grid.Column="1"
               Text="{Binding Path=SuitName}">
    </TextBlock>

    <DataGrid Name="TestNameGrid"
              Grid.Row="1"
              Grid.Column="1"
              RowHeight="{Binding Path=RowHeight}"
              AutoGenerateColumns="False"
              HeadersVisibility="None"
              CanUserAddRows="False"
              CanUserDeleteRows="False"
              CanUserReorderColumns="False"
              CanUserResizeColumns="False"
              CanUserResizeRows="False"
              CanUserSortColumns="False"
              IsReadOnly="True"
              ItemsSource="{Binding Path=TestResultList}">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="TestName"
                                Binding="{Binding Path=Name}"
                                Width="1.5*"/>
            <DataGridTextColumn x:Name="TestValue"
                                Binding="{Binding Path=Value}"
                                Width="2*"/>
        </DataGrid.Columns>
    </DataGrid>

</Grid>
这个C代码:

namespace WpfApplication1
{
public partial class DataGridControl : UserControl, INotifyPropertyChanged
{
    private double _rowHeight;
    private double _columnWidth;

    public DataGridControl()
    {
        InitializeComponent();

        this._rowHeight = 19.0;
        this._columnWidth = 19.0;
        this.TestNameGrid.Visibility = System.Windows.Visibility.Hidden;
        this.Height = this._rowHeight;

        this.DataContext = this;
    }

    public double RowHeight
    {
        get { return this._rowHeight; }
        set { this._rowHeight = value; }
    }

    public double ColumnWidth
    {
        get { return this._columnWidth; }
        set { this._columnWidth = value; }
    }

    private void MinimizeButton_Click(object sender, RoutedEventArgs e)
    {
        if (this.TestNameGrid.Visibility == System.Windows.Visibility.Visible)
        {
            this.TestNameGrid.Visibility = System.Windows.Visibility.Hidden;
            this.Height = this.MinimizeButton.Height;
        }
        else if (this.TestNameGrid.Visibility == System.Windows.Visibility.Hidden)
        {
            this.TestNameGrid.Visibility = System.Windows.Visibility.Visible;
            if (this.TestNameGrid.Items.Count > 0)
                this.TestNameGrid.Height = this.TestNameGrid.Items.Count * this._rowHeight + 2;
            else
                this.TestNameGrid.Height = 0;
            this.Height = this.MinimizeButton.Height + this.TestNameGrid.Height;
        }
    }

    public static readonly DependencyProperty SuitNameProperty = DependencyProperty.Register("SuitName", typeof(string), typeof(DataGridControl));

    public string SuitName
    {
        get { return (string)GetValue(SuitNameProperty); }
        set
        {
            SetValue(SuitNameProperty, value);
            OnPropertyChanged("SuitName");
        }
    }

    public static readonly DependencyProperty TestResultListProperty = DependencyProperty.Register("TestResultList", typeof(ObservableCollection<PairClass>), typeof(DataGridControl));

    public ObservableCollection<PairClass> TestResultList
    {
        get { return (ObservableCollection<PairClass>)GetValue(TestResultListProperty); }
        set
        {
            SetValue(TestResultListProperty, value);
            OnPropertyChanged("TestResultList");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}
}
我使用此usercontrol的窗口的xaml如下所示

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="481" Width="626"
    >
<Grid Background="#00BFFF">

    <DataGrid x:Name="TestTemplateDataGrid"
              AutoGenerateColumns="False"
              CanUserAddRows="False"
              ItemsSource="{Binding CfTest>
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="1*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <local:DataGridControl x:Name="ustctl"
                                               DataContext="{Binding}"
                                               SuitName="{Binding Path=Str}" 
                                               TestResultList="{Binding Path=PcList}">
                        </local:DataGridControl>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

</Grid>

如何将数据绑定到DataGrid中的UserControl?

您希望UserControl继承使用它的对象的datacontext。usercontrol构造函数中的代码

this.DataContext = this;

正在阻止这种情况发生。继承的datacontext允许您绑定依赖项属性。

您在发布的代码中面临什么问题?数据未绑定到我的usercontrol。在usercontrol构造函数中,您可以这样做。datacontext=this;这会覆盖和更改上下文,因此绑定将无法工作我在UsertControl中注释掉了DataContext,但它没有帮助我在UsertControl中注释掉DataContext,但它没有帮助我没有将所有绑定属性都视为依赖属性。在usercontrol中,您有RowHeight和ColumnHeight的绑定,但我没有看到它们在类中注册为DPs依赖属性。要绑定的所有属性都必须是DPsIt,因为它不是行高和列宽所必需的。我可以严格地进入它们。这不会是一个问题。我必须绑定SuiteName和TestResultList。
this.DataContext = this;