2012-06-08 2 views
4

Я новичок в WPF, и я создаю элемент управления. Этот элемент управления содержит DataGrid и некоторые другие элементы управления WPF.Как открыть элемент управления в XAML

Я создал свой контроль, как показано ниже:

<UserControl x:Class="MyControls.MyControl" 
     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" 
     d:DesignHeight="329" d:DesignWidth="535" > 
<Grid> 
    <DataGrid Margin="6,25,6,35" Name="dataGrid" SelectionUnit="CellOrRowHeader" x:FieldModifier="public" HeadersVisibility="All"/> 
    <OtherControl HorizontalAlignment="Left" x:Name="otherControl" Height="34" VerticalAlignment="Bottom" Width="523" x:FieldModifier="private"/> 
    <Label Content="caption" Height="24" HorizontalAlignment="Left" Name="captionLabel" VerticalAlignment="Top" Foreground="#FF2626D1" x:FieldModifier="private"/> 
</Grid> 
</UserControl> 

Таким образом, все идет хорошо до сих пор, а затем создать контейнер UserControl, который имеет в нем мой контроль, созданный ранее:

<UserControl x:Class="MyContainers.MyContainer" 
     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" 
     d:DesignHeight="300" d:DesignWidth="300" xmlns:my="clr-namespace:MyControls"> 
<Grid> 
    <my:MyControl> 

    </my:MyControl> 
</Grid> 

Что я не могу сделать, это следующее:

<my:MyControl> 
    <my:MyControl.dataGrid> 

    </my:MyControl.dataGrid> 
</my:MyControl> 

Я ранее задал свойство datagrid FieldModifier как public, чтобы получить к нему доступ в другом xaml, но это вызывает ошибку в визуальной студии.

Мне нужно «разоблачить» мою dataGrid, чтобы добавить столбцы и их стили.

Я хотел бы быть в состоянии сделать что-то вроде этого:

<my:MyControl.dataGrid.Columns > 
    <DataGridTextColumn /> 
    <DataGridTextColumn /> 
    ... 
    <DataGridTextColumn /> 
</my:MyControl.dataGrid.Columns> 

Итак, не достаточно, чтобы установить свойство DataGrid по FieldModifierpublic, как?

Нужно ли мне что-то делать? Как я могу это достичь? Возможно ли это?

Надеюсь, кто-то может мне помочь. Заранее спасибо.

+0

Две быстрые мысли, для стартера вы назвали свою сетку данных 'dataGrid', а не' DataGrid'. Во-вторых, вы не добавляете столбцы непосредственно в datagrid, вы не добавляете столбцы непосредственно в сетку, вы добавляете их в свойство 'DataGrid.Columns', поэтому можете попробовать:' ', я не уверен, что это сработает или нет, я никогда не пробовал делать что-то подобное. – CodingGorilla

+0

@CodingGorilla Я даже не могу получить доступ к '' – Dante

+0

@Danta Когда вы говорите «не может даже получить доступ», что это значит, вы получаете ошибку компиляции/времени выполнения? Если так, то, что это? – CodingGorilla

ответ

5

DataGridMyControl.dataGrid - MyControl не имеет свойства «dataGrid».

Вы можете попробовать добавить свойство зависимостей типа ObservableCollection<DataGridColumn> к MyControl и изменить столбцы dataGrid всякий раз, когда эта коллекция изменяется.

EDIT: Взбитые вместе быстрый пример для вас:

UserControl код:

public partial class UserControl1 : UserControl 
{ 
    public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(ObservableCollection<DataGridColumn>), typeof(UserControl1)); 
    public ObservableCollection<DataGridColumn> Columns 
    { 
     get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); } 
     set { SetValue(ColumnsProperty, value); } 
    } 


    public UserControl1() 
    { 
     Columns = new ObservableCollection<DataGridColumn>(); 
     Columns.CollectionChanged += (s, a) => 
      { 
       dataGrid.Columns.Clear(); 
       foreach (var column in this.Columns) 
        dataGrid.Columns.Add(column); 
      }; 
     InitializeComponent(); 
    } 
} 

UserControl XAML:

<UserControl x:Class="WpfApplication1.UserControl1" 
     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"> 
<Grid> 
    <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"/> 
</Grid> 

так что вы можете использовать его как:

<Grid> 
    <l:UserControl1> 
     <l:UserControl1.Columns> 
      <DataGridTextColumn Header="Col1"/> 
      <DataGridTextColumn Header="Col2"/> 
     </l:UserControl1.Columns> 
    </l:UserControl1> 
</Grid> 
Смежные вопросы