2

EDIT (Klärung der Anforderungen)Stil Datagridtemplatecolumn DataGridComboBoxColumn

ich einen DataGrid wie unten gezeigt haben übereinstimmen. Die Werte in der Spalte "Feldname zum Speichern der alten EmpNo" ändern sich basierend auf dem in der Spalte "Neue EmpNo-Regel" ausgewählten Wert. Um dies zu ermöglichen, hat jeder Artikel in der DataGridItemsSource seine eigene . Ich muss an diese binden und nicht eine statische Eigenschaft, die sich nicht ändern kann.

Wenn es eine Möglichkeit gibt, diese Bindung während der Verwendung von DataGridComboBoxTemplate zu tun, würde ich das bevorzugen. Wenn nicht, würde ich gerne wissen, ob es möglich ist, die DataGridTemplateColumn/ComboBox auf Vorlage, die der OP DataGridComboBoxTemplate

passen

ich ein Szenario, wo ich DataGridComboBoxColumn für eine der DataGrid Spalten verwende . In einer anderen Spalte muss ich die DataGridTemplateColumn mit einer ComboBox verwenden, um ordnungsgemäß an eine dynamische ItemSource in der VM zu binden.

Das DataGridComboBoxColumn ("New EmpNo Rule") ist gestylt anders als die DataGridTemplateColumn mit einem ComboBox ("Feldnamen zu speichern Alt EmpNo") wie hier gezeigt:

enter image description here

Wie kann ich Stil die DataGridTemplateColumn/ComboBox mit der DataGridComboBoxColumn, insbesondere, wie die Combobox ausgeblendet wird, wenn die tatsächliche Zelle nicht ausgewählt ist (wie die zweite Zeile von "New EmpNo Rule").

EDIT (hinzugefügt DataGrid Code):

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

XAML-Ressourcen:

<UserControl.Resources> 
     <ResourceDictionary> 
      <CollectionViewSource x:Key="StaticEmpNoRuleCollection" Source="{Binding EmpNoRuleCollection}" />     
     </ResourceDictionary>   
    </UserControl.Resources> 

.... 

       <DataGrid Name="DataGrid_MultiCompanyInfo" 
          ItemsSource="{Binding Model.EmpNoOptionsCollection}" 
          SelectedItem="{Binding SelectedEmpNoOptions}" 
          AutoGenerateColumns="False" 
          CanUserAddRows="False" 
          CanUserDeleteRows="False"> 
        <DataGrid.Columns> 

         <!-- Company --> 
         <DataGridTextColumn Header="Company" 
              Binding="{Binding Company}" 
              IsReadOnly="True" /> 

         <!-- New EmpNo Rule --> 
         <DataGridComboBoxColumn Header="New EmpNo Rule" 
               Width="200" 
               ItemsSource="{Binding Source={StaticResource StaticEmpNoRuleCollection}}" 
               DisplayMemberPath="Description" 
               SelectedValueBinding="{Binding SelectedEmpNoRule, UpdateSourceTrigger=PropertyChanged}"/> 

         <!-- Field Name To Store Old EmpNo --> 
         <DataGridTemplateColumn Header="Field Name To&#x0a;Store Old EmpNo" 
               Width="150" > 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <ComboBox Name="OldEmpNo_ComboBox" 
               Margin="-5,0,0,0" 
               ItemsSource="{Binding TableNameForOldDataCollection}" 
               SelectedValue="{Binding TableNameForOldData, UpdateSourceTrigger=PropertyChanged}" /> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 

         ... 

        </DataGrid.Columns> 
       </DataGrid> 
+0

Könnten Sie bitte Ihren DataGridTemplateColumn Code veröffentlichen? – Jose

+0

@Kirenenko Siehe bearbeiten zu OP. – BrianKE

+0

Ich denke, dass der richtige Weg ist, DataGridComboBoxColumn auf "Old EmpNo" zu verwenden, aber Sie sollten korrekt binden, mit 'RelativeSource =" {RelativeSource AncestorType = {x: Type DataGrid}} ". – Jose

Antwort

0

Unter Berücksichtigung der Tatsache, dass DataGridComboBoxColumn nicht in der gleichen visuellen Struktur ist, können Sie eine BindingProxy verwenden

<Window.Resources> 
    <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</Window.Resources> 

XAML-Bindung (nicht auf der visuellen Struktur):

<DataGridComboBoxColumn ItemsSource="{Binding Data.TableNameForOldDataCollection, Source={StaticResource proxy}}"/> 

UPDATE

Ganz andere Lösung ... Sieht ein wenig hackish, aber ich habe es ausprobiert eine funktioniert es:

<DataGridComboBoxColumn Header="Field Name To&#x0a;Store Old EmpNo" Width="150" 
SelectedItemBinding="{Binding TableNameForOldData, UpdateSourceTrigger=PropertyChanged}> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding TableNameForOldDataCollection}"/> 
      <Setter Property="IsReadOnly" Value="True"/> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
    <DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding TableNameForOldDataCollection}"/> 
     </Style> 
    </DataGridComboBoxColumn.EditingElementStyle> 
</DataGridComboBoxColumn> 

Auch ich denke, es ist ein duplicate, also werde ich es kennzeichnen.

+0

Obwohl mir diese Option, eine bindbare Sammlung bereitzustellen, gefällt, funktioniert sie für mein Szenario nicht (siehe hinzugefügte Anforderungen in OP). Es scheint an eine Auflistung im DataGrid selbst und nicht an eine Eigenschaft in jedem Element in EmpNoOptionsCollection zu binden. Wenn ich etwas vermisse und dies funktionieren würde, um die Anforderungen zu erfüllen, können Sie das bitte weiter erläutern? – BrianKE

+0

Ich dachte, dass Ihre 'TableNameForOldDataCollection' auf Ihrem Haupt-DataContext/ViewModel war. Sagen Sie mir einfach, wo das Objekt zu binden ist, weil Sie den Proxy "Data" darauf verweisen müssen. – Jose

+0

Die 'TableNameForOldDataCollection' befindet sich auf jedem einzelnen Element in' Model.EmpNoOptionsCollection'. Jedes Element im 'DataGrid' hat eine eigene Kopie von' TableNameForOldDataCollection', da sich die Werte basierend auf dem Wert von 'StaticEmpNoRuleCollection' ändern können. – BrianKE

Verwandte Themen