2015-02-06 3 views
1

Я создал UserControl для многократного использования в моей программе:Binding недвижимости во время выполнения

GroupPanel.xaml:

<UserControl x:Class="View.UserControls.GroupPanel" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"assembly=ViewModel" 
      Name="root"> 
    <DockPanel> 
     <DataGrid DockPanel.Dock="Top" 
        AutoGenerateColumns="False" 
        CanUserAddRows="True" 
        CanUserDeleteRows="False" 
        CanUserReorderColumns="False" 
        DataContext="{Binding ElementName=root}" 
        ItemsSource="{Binding DataGridItemSource}" 
        Name="mainGrid"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Nr/Unit" 
            Binding="{Binding Nr}" /> 
       <DataGridTextColumn Header="Text" 
            Binding="{Binding Text}" /> 
       <DataGridTextColumn Header="Comment" 
            Binding="{Binding Comment}" /> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <Button Content="Delete" /> 
          </StackPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </DockPanel> 

и Dependency Property, чтобы установить ItemsSource в DataGrid в:

GroupPanel.xaml .cs: ​​

public static readonly DependencyProperty DataGridItemSourceProperty = 
     DependencyProperty.Register("DataGridItemSource", typeof(IEnumerable), typeof(GroupPanel), 
            new PropertyMetadata(null)); 

    public IEnumerable DataGridItemSource 
    { 
     get { return (IEnumerable)GetValue(DataGridItemSourceProperty); } 
     set { SetValue(DataGridItemSourceProperty, value); } 
    } 

У меня есть окно, где мне нужен этот UserControl 2 раза с помощью разных ItemsSources для привязки. Но оба источника имеют одинаковые свойства до первого свойства. Источниками являются:

GroupNumber: 
Number, int 
Text, string 
Comment, string 

GroupUnit: 
Unt, int 
Text, string 
Comment, string 

Поведение одинаково для обоих из них. Есть ли способ установить привязку столбца 1 DataGrid в зависимости от ItemsSource?

Я пытался что-то вроде этого:

void GroupPanel_Loaded(object sender, RoutedEventArgs e) 
    { 
     var type = DataGridItemSource.GetType(); 
     if(type.FullName.Contains("GroupNumber")) 
     { 

     } 
    } 

Но я не знаю, как установить столбцы обязательные внутри, если ...

Спасибо заранее

+0

Я предлагаю вам прочитать о 'DataTemplate'. Здесь вам не нужен «UserControl», вы можете просто определить «Стиль» для своего «DataGrid» и повторно использовать его. – dymanoid

+0

WPF использует XAML, а XAML - подробный ... просто привыкнуть к нему. определение программных столбцов DataGrid' - это * не * путь. Вы часто будете иметь дублированные разделы XAML, но поверьте мне ... в конечном итоге вы упростите себя, если вы просто примете этот факт. Это возможно *. См. Событие ['DataGrid.AutoGeneratingColumn'] (https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.autogeneratingcolumn (v = vs.110) .aspx) на MSDN. – Sheridan

ответ

1

Вы можете добавьте другое свойство dependecy к вашему GroupPanel usercontrol:

public string FirstColumnBindingPropertyName 
{ 
    get { return (string)GetValue(FirstColumnBindingPropertyNameProperty); } 
    set { SetValue(FirstColumnBindingPropertyNameProperty, value); } 
} 

public static readonly DependencyProperty FirstColumnBindingPropertyNameProperty = 
    DependencyProperty.Register("FirstColumnBindingPropertyName", typeof(string), typeof(GroupPanel), new UIPropertyMetadata(null, new PropertyChangedCallback(OnFirstColumnBindingPropertyNameChanged))); 


private static void OnFirstColumnBindingPropertyNameChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
{ 
    GroupPanel groupPanel = (GroupPanel)dependencyObject; 
    DataGridTextColumn dataGridTextColumn = groupPanel.mainGrid.Columns[0] as DataGridTextColumn; 
    if (args.NewValue == null) 
    { 
     dataGridTextColumn.Binding = null; 
    } 
    else 
    { 
     dataGridTextColumn.Binding = new Binding(Convert.ToString(args.NewValue)); 
    } 
} 

Затем в вашем окне у вас будет:

<local:GroupPanel FirstColumnBindingPropertyName="Number" /> 
<local:GroupPanel FirstColumnBindingPropertyName="Unt" /> 
0

Вы можете использовать DataTemplateSelector. См. Ниже код.

<Window x:Class="DataTemplateSelector_Learning.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DataTemplateSelector_Learning" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <DataTemplate x:Key="GroupNumber"> 
     <TextBlock Text="{Binding Number}"/> 
    </DataTemplate> 
    <DataTemplate x:Key="GroupUnit"> 
     <TextBlock Text="{Binding Unit}" /> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <DataGrid DockPanel.Dock="Top" 
       AutoGenerateColumns="False" 
       CanUserAddRows="False" 
       CanUserDeleteRows="False" 
       CanUserReorderColumns="False"     
       Name="numGrid"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="GroupNumber"> 
       <DataGridTemplateColumn.CellTemplateSelector> 
        <local:GroupTemplateSelector 
         GroupNumber="{StaticResource GroupNumber}" 
         GroupUnit="{StaticResource GroupUnit}"/> 
       </DataGridTemplateColumn.CellTemplateSelector> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Text" 
           Binding="{Binding Text}" /> 
      <DataGridTextColumn Header="Comment" 
           Binding="{Binding Comment}" /> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Button Content="Delete" /> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
    <DataGrid DockPanel.Dock="Top" 
       AutoGenerateColumns="False" 
       CanUserAddRows="False" 
       CanUserDeleteRows="False" 
       CanUserReorderColumns="False"     
       Name="unitGrid"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="GroupUnit"> 
       <DataGridTemplateColumn.CellTemplateSelector> 
        <local:GroupTemplateSelector 
         GroupNumber="{StaticResource GroupNumber}" 
         GroupUnit="{StaticResource GroupUnit}"/> 
       </DataGridTemplateColumn.CellTemplateSelector> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Text" 
           Binding="{Binding Text}" /> 
      <DataGridTextColumn Header="Comment" 
           Binding="{Binding Comment}" /> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Button Content="Delete" /> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</StackPanel> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ObservableCollection<GroupNumber> lstNum = new ObservableCollection<GroupNumber>(); 
     lstNum.Add(new GroupNumber() { Number=1,Text="Test",Comment="Comment"}); 
     numGrid.ItemsSource = lstNum; 
     ObservableCollection<Groupunit> lstUnit = new ObservableCollection<Groupunit>(); 
     lstUnit.Add(new Groupunit() { Unit = 2, Text = "Test", Comment = "Comment" }); 
     unitGrid.ItemsSource = lstUnit; 
    } 
} 

public class GroupTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate GroupNumber 
    { get; set; } 

    public DataTemplate GroupUnit 
    { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    {    
     if (item is GroupNumber) 
     { 
      return GroupNumber; 
     } 
     else if (item is Groupunit) 
     { 
      return GroupUnit; 
     } 

     else 
      return base.SelectTemplate(item, container); 
    } 

} 

public class GroupNumber 
{ 
    private int number; 

    public int Number 
    { 
     get { return number; } 
     set { number = value; } 
    } 

    private string text; 

    public string Text 
    { 
     get { return text; } 
     set { text = value; } 
    } 

    private string comment; 

    public string Comment 
    { 
     get { return comment; } 
     set { comment = value; } 
    }  
} 

public class Groupunit 
{ 
    private int unit; 

    public int Unit 
    { 
     get { return unit; } 
     set { unit = value; } 
    } 

    private string text; 

    public string Text 
    { 
     get { return text; } 
     set { text = value; } 
    } 

    private string comment; 

    public string Comment 
    { 
     get { return comment; } 
     set { comment = value; } 
    } 
} 
Смежные вопросы