4

私はWPFが初めてで、コントロールを作成しています。このコントロールには、DataGrid とその他の WPF コントロールが含まれています。

以下のようにコントロールを作成しました。

<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>

別の xaml でアクセスできるようにするために、以前にデータグリッドのプロパティをFieldModifierasに設定しましたが、Visual Studio からエラーが発生します。public

列とそのスタイルを追加できるようにするには、dataGrid を「公開」する必要があります。

私はこのようなことができるようにしたいと思います:

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

FieldModifierでは、データグリッドのプロパティをasに設定するだけでは十分ではありませんpublicか?

他に何かする必要がありますか?どうすればこれを達成できますか?これは可能ですか?

誰かが私を助けてくれることを願っています。前もって感謝します。

4

1 に答える 1

5

「dataGrid」という名前のプロパティ がないため、子DataGridにアクセスできません。MyControl.dataGridMyControl

タイプの依存関係プロパティを に追加して、ObservableCollection<DataGridColumn>そのMyControlコレクションが変更されるたびに dataGrid 列を変更してみてください。

編集:簡単な例をまとめました:

ユーザー コントロール コード:

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();
    }
}

ユーザー コントロール 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>
于 2012-06-08T17:02:28.397 に答える