2011-06-07 148 views
2

我有我整個應用程序中使用網格控件。我想擴展網格控件以包含一個上下文菜單,其中一個項目「凍結/解凍列」。如果我選擇使用自定義的控制,我無法實現的控制範圍之內此功能 - 相反,我要實現我的地方把我的自定義控制功能。另一種方法是用戶控制,其中我可以實現所有必要的功能的控制範圍內:WPF用戶VS自定義控件

<Grid> 
    <dxg:GridControl Name="gridData" DataSource="{Binding}" dx:DXSerializer.StoreLayoutMode="All"> 
     <dxg:GridControl.Resources></dxg:GridControl.Resources> 
     <dxg:GridControl.Columns /> 
     <dxg:GridControl.View> 
      <dxg:TableView ShowGroupPanel="False" MouseRightButtonUp="TableView_MouseRightButtonUp"> 
       <dxg:TableView.ColumnMenuCustomizations> 
        <dxb:BarButtonItem Name="freezeColButton" Content="Freeze Column(s)" dxb:BarItemLinkActionBase.ItemLinkIndex="0" ItemClick="freezeColButton_ItemClick" /> 
       </dxg:TableView.ColumnMenuCustomizations> 
      </dxg:TableView> 
     </dxg:GridControl.View> 
    </dxg:GridControl> 
</Grid> 

通知,TableView.ColumnMenuCustomization標籤包括用於冷凍的事件處理程序/解凍功能。

但是,用戶控件唯一的問題是我無法訪問基礎Grid的Columns屬性。例如,當我把我的用戶控件(如上所述)在一個窗口中,我得到一個錯誤(錯誤25:標籤「ExtendedGridControl.Columns」不存在XML命名空間存在「CLR的命名空間:UI.Controls」):

<Window> 
    ... 
    <Grid> 
     <uc:ExtendedGridControl x:Name="extendedGridData" > 
      <uc:ExtendedGridControl.Columns> 
       <dxg::GridColumn FieldName="FieldA" Visible="True" /> 
       ... 
      </uc:ExtendedGridControl.Columns> 
     </uc:ExtendedGridControl> 
    </Grid 
</Window> 

如何顯示GridControl屬性?任何幫助/建議將不勝感激。

回答

4

您需要通過在UserControl上定義屬性來傳播屬性,例如,

public partial class Bogus : UserControl 
{ 
    // You often can reuse properties via DependencyProperty.AddOwner 
    public static readonly DependencyProperty ItemsSourceProperty = ItemsControl.ItemsSourceProperty.AddOwner(typeof(Bogus)); 
    public IEnumerable ItemsSource 
    { 
     get { return (IEnumerable)GetValue(ItemsSourceProperty); } 
     set { SetValue(ItemsSourceProperty, value); } 
    } 

    public static readonly DependencyProperty ItemTemplateProperty = ItemsControl.ItemTemplateProperty.AddOwner(typeof(Bogus)); 
    public DataTemplate ItemTemplate 
    { 
     get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
     set { SetValue(ItemTemplateProperty, value); } 
    } 

    public Bogus() 
    { 
     InitializeComponent(); 
    } 
} 
<UserControl x:Class="Test.UserControls.Bogus" 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" Name="control"> 
    <StackPanel> 
     <TextBlock Text="Lorem Ipsum:" /> 
     <ItemsControl ItemsSource="{Binding ElementName=control, Path=ItemsSource}" 
       ItemTemplate="{Binding ElementName=control, Path=ItemTemplate}" /> 
    </StackPanel> 
</UserControl> 

性質外是可見的,所述內部控制與它們結合。

對於某些屬性,您不使用DependencyProperty,而只是一個引用內部控件屬性的clr屬性,對於某些只包含setter或內部構造函數的屬性或者不是內部控件中的依賴項屬性無論如何,例如

public ItemCollection Items 
{ 
    get { return _itemsControl.Items; } 
} 
+0

感謝您的快速響應!你推薦的偉大工程 - 我用了CLR的屬性,它引用了內部控制的財產: 公共GridColumnCollection列 { 得到 { 回報gridData.Columns; } set { gridData.Columns = value; } } 但是,現在我的窗口(包含用戶控件)將覆蓋在底層網格屬性「列」中定義的任何設置。 – 2011-06-07 14:57:11

+0

是的,對於喜歡收藏欄你通常與正常CLR的屬性去。很高興它幫助:} – 2011-06-07 14:58:38

+0

我能保證我保持用戶控件(不是最優雅的)創建的任何現有設置: 設置 {// 確保現有的集合不丟失 的foreach(在VAR的GridData項目。 View.ColumnMenuCustomizations) value.ColumnMenuCustomizations.Add(項目); gridData.View =值; } – 2011-06-07 15:05:05