C# 如何将数据绑定到UserControl
我有一个带有按钮、文本块和数据网格的my 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="
<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;