2010-05-31 3 views
0

Hey, j'ai un UserControll avec un DependencyProperty appelé "Risikobewertung" qui a son propre type de données "RisikoBewertung" (Type de données créé par LINQ). Donc, dans mon contrôle, j'essaie de lier les champs de RisikoBewertung aux TextBox sur le Controll, mais cela ne fonctionnera pas. J'espère que vous pouvez me aider, et me dire pourquoi;)La liaison de données WPF ne fonctionnera pas

code: UserControl.xaml:

<UserControl x:Class="Cis.Modules.RiskManagement.Views.Controls.RisikoBewertungEditor" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:gridtools="clr-namespace:TmgUnity.Common.Presentation.Controls.DataGridTools;assembly=TmgUnity.Common.Presentation" 
xmlns:converter="clr-namespace:Cis.Modules.RiskManagement.Views.Converter" 
xmlns:tmg="clr-namespace:TmgUnity.Common.Presentation.Controls.FilterDataGrid;assembly=TmgUnity.Common.Presentation" 
xmlns:validators="clr-namespace:TmgUnity.Common.Presentation.ValidationRules;assembly=TmgUnity.Common.Presentation" 
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
xmlns:risikoControls="clr-namespace:Cis.Modules.RiskManagement.Views.Controls"> 
<UserControl.Resources> 
    <converter:CountToArrowConverter x:Key="CountConverter" /> 
</UserControl.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Name="Veränderung"/> 
     <ColumnDefinition Name="Volumen" /> 
     <ColumnDefinition Name="Schadenshöhe" /> 
     <ColumnDefinition Name="SchadensOrte" /> 
     <ColumnDefinition Name="Wahrscheinlichkeit" /> 
     <ColumnDefinition Name="Kategorie" /> 
     <ColumnDefinition Name="Handlungsbedarf" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="20" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Image Source="{Binding Path=Entwicklung, Converter={StaticResource CountConverter}, UpdateSourceTrigger=PropertyChanged}" Grid.RowSpan="2" Grid.Row="0" Width="68" Height="68" Grid.Column="0" /> 
    <TextBox Grid.Column="1" Grid.Row="0" Text="Volumen" /> 
    <TextBox Grid.Column="1" Grid.Row="1"> 
     <TextBox.Text> 
      <Binding Path="Volumen" UpdateSourceTrigger="PropertyChanged" /> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox Grid.Column="2" Grid.Row="0" Text="Schadenshöhe" /> 
    <TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Schadenshöhe, UpdateSourceTrigger=PropertyChanged}" /> 
    <StackPanel Grid.Column="3" Grid.RowSpan="2" Grid.Row="0" Orientation="Horizontal"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="20" /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <TextBox Text ="Politik" Grid.Row="0" Grid.Column="0"/> 
      <CheckBox Name="Politik" Grid.Row="1" Grid.Column="0" IsChecked="{Binding Path=Politik, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
      <TextBox Text ="Vermögen" Grid.Row="0" Grid.Column="1" /> 
      <CheckBox Name="Vermögen" Grid.Row="1" Grid.Column="1" IsChecked="{Binding Path=Vermögen, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
      <TextBox Text ="Vertrauen" Grid.Row="0" Grid.Column="2" /> 
      <CheckBox Name="Vertrauen" Grid.Row="1" Grid.Column="2" IsChecked="{Binding Path=Vertrauen, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
     </Grid> 
    </StackPanel> 
    <TextBox Grid.Column="4" Grid.Row="0" Text="Wahrscheinlichkeit" /> 
    <TextBox Grid.Column="4" Grid.Row="1" Text="{Binding Path=Wahrscheinlichkeit, UpdateSourceTrigger=PropertyChanged}"/> 
    <risikoControls:RiskTrafficLightControl Grid.Column="5" Grid.Row="0" Grid.RowSpan="2" RiskValue="{Binding Path=Kategorie, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <StackPanel Grid.Column="6" Grid.RowSpan="2" Grid.Row="0" Orientation="Vertical"> 
     <TextBox Text="Handlungsbedarf" /> 
     <CheckBox VerticalAlignment="Center" HorizontalAlignment="Center" IsChecked="{Binding Path=Handlungsbedarf, UpdateSourceTrigger=PropertyChanged}" /> 

    </StackPanel> 
</Grid> 

Le CodeBehind:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using Cis.Modules.RiskManagement.Data; 
using Cis.Modules.RiskManagement.Views.Models; 


namespace Cis.Modules.RiskManagement.Views.Controls 
{ 
    /// <summary> 
    /// Interaktionslogik für RisikoBewertungEditor.xaml 
    /// </summary> 
    public partial class RisikoBewertungEditor : UserControl, INotifyPropertyChanged 
    { 


     public event PropertyChangedEventHandler PropertyChanged; 
     public static readonly DependencyProperty RisikoBewertungProperty = DependencyProperty.Register("RisikoBewertung", typeof(RisikoBewertung), typeof(RisikoBewertungEditor), new PropertyMetadata(null, new PropertyChangedCallback(RisikoBewertungChanged))); 
     // public static readonly DependencyProperty Readonly = DependencyProperty.Register("EditorReadonly", typeof(Boolean), typeof(RisikoBewertungEditor), new PropertyMetadata(null, new PropertyChangedCallback(ReadonlyChanged))); 

     private static void RisikoBewertungChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs arguments) 
     { 
      var bewertungEditor = dependencyObject as RisikoBewertungEditor; 
      bewertungEditor.RisikoBewertung = arguments.NewValue as RisikoBewertung; 
     } 
     /* 
      private static void ReadonlyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs arguments) 
      { 
      } 
     */ 
     public RisikoBewertung RisikoBewertung 
     { 
      get 
      { 
       return GetValue(RisikoBewertungProperty) as RisikoBewertung; 
      } 
      set 
      { 
       SetValue(RisikoBewertungProperty, value); 

       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs("RisikoBewertung")); 
       } 
      } 
     } 
     /* 
      public Boolean EditorReadonly 
      { 
       get; 
       set; 
      } 
      */ 

     public void mebosho(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show(RisikoBewertung.LfdNr.ToString()); 
     } 

     public RisikoBewertungEditor() 
     { 
      InitializeComponent(); 
      RisikoBewertung = new RisikoBewertung(); 
      this.DataContext = (GetValue(RisikoBewertungProperty) as RisikoBewertung); 
     } 

    } 
} 

et un petit exemple de c'est l'usage:

 <tmg:FilterDataGrid Grid.Row="0" AutoGenerateColumns="False" 
         ItemsSource="{Binding TodoListe}" 
         IsReadOnly="False" x:Name="TodoListeDataGrid" 
         CanUserAddRows="False" SelectionUnit="FullRow" 
         SelectedValuePath="." 
         SelectedValue="{Binding CurrentTodoItem}" 
         gridtools:DataGridStyle.SelectAllButtonTemplate="{DynamicResource CisSelectAllButtonTemplate}" 
         CanUserResizeColumns="True" MinHeight="80" 
         SelectionChanged="SelectionChanged" 
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         diagnostics:PresentationTraceSources.TraceLevel="High" 
         > 
     <tmg:FilterDataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <risikoControls:RisikoBewertungEditor x:Name="BewertungEditor" RisikoBewertung="{Binding ElementName=TodoListeDataGrid, Path=SelectedValue}" diagnostics:PresentationTraceSources.TraceLevel="High"> 
       </risikoControls:RisikoBewertungEditor> 
      </DataTemplate> 
     </tmg:FilterDataGrid.RowDetailsTemplate> 

     <tmg:FilterDataGrid.Columns> 
      <toolkit:DataGridTextColumn Binding="{Binding Path=LfdNr}" Header="LfdNr" /> 
     </tmg:FilterDataGrid.Columns> 

    </tmg:FilterDataGrid> 

Répondre

1

Le problème est que dans le constructeur de votre contrôle utilisateur, vous créez un nouvel objet et le définir comme le DataContext, plus tard, lorsque vous définissez la RisikoBewertung propriété à quelque chose d'autre en XAML, le DataContext reste mis sur l'autre vide objet. Ce que vous devez faire est de lier le DataContext du contrôle utilisateur à la propriété RisikoBewertung. Comme ceci:

<UserControl ... 
    DataContext=" 
     {Binding RelativeSource={RelativeSource Self}, 
       Path=RisikoBewertung}" 
.../> 

Et tout enlever de son constructeur, sauf InitializeComponent();

public RisikoBewertungEditor() 
{ 
    InitializeComponent(); 
} 
0

Je ne vois pas que vous définissez ItemsSource de votre grille à n'importe quoi.

+1

Le DataGrid fonctionne Perfekt, je ne pense pas thats le problème. – Tokk

+0

Je suis d'accord. J'ai également eu la même erreur et sur aucune autre MS Windows aucune erreur. Il semble que certaines DLL sont manquantes ou quelque chose comme avec SL4-SL5 arrive ... –

Questions connexes