none
A TwoWay or OneWayToSource binding cannot work on the read-only property 'TimeOfDay' of type 'System.DateTime'. RRS feed

  • Frage

  • Hallo,

    ich hab folgendes Problem: Ich bekomme immer die in der Überschrift genannte Fehlermeldung.

    Der Xaml - Parser wirft mir hier eine Exception, das er TwoWay oder OneWayTo Source Bindings nicht umsetzen kann bei der TimeOfDay - Property. Wie man aber im xaml Code sieht steht der Mode auf OneWay.

    <ListView Margin="5,42.8,4,8" Grid.Row="1" x:Name="Listname" 
      		ItemsSource="{Binding ., Mode=OneWay, Source={StaticResource eine_collectionviewsource}}" 
      		ItemTemplate="{StaticResource ItemTemplate}"
      		SelectedIndex="-1"/>

    Kann mir da jemand helfen?

    PS: Die Verwendung eines DataGrid hab ich schon testweise versucht. Da funktioniert es sobald ich beim DataGrid die isReadOnly - Property auf "true" setze. Dann gibt kein mucken. Da das GUI aber ein starkes Customizing erfordert ist ein eher starres DataGrid keine Option.

    Mittwoch, 7. Juli 2010 13:47

Antworten

  • Ohne Dein DataTemplate zu kennen, vermute ich, dass dort zu der gebundenen Eigenschaft "TimeOfDay" explizit oder implite ein TwoWay angeben ist. Ich kann mit dem folgenden Codeschnipsel Dein Problem nicht reproduzieren:
     

    <Window x:Class="MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="350" Width="525"
         xmlns:vm="clr-namespace:WpfApplication1"
         >
     <Window.Resources>
      <vm:CVS x:Key="eine_collectionviewsource"/>
      <DataTemplate x:Key="ItemTemplate">
       <TextBox Text="{Binding TimeOfDay, Mode=OneWay}"/>
      </DataTemplate>
     </Window.Resources>
     <Grid>
      <ListView Margin="5,42.8,4,8" Grid.Row="1" x:Name="Listname" 
     		ItemsSource="{Binding .,Mode=OneWay, Source={StaticResource eine_collectionviewsource}}" 
     		ItemTemplate="{StaticResource ItemTemplate}"
     		SelectedIndex="-1"/>
     </Grid>
    </Window>
    

    Dazu der Modul mit den Daten:

    Public Class CVS
     Inherits CollectionViewSource
    
     Public Sub New()
      Dim l As New List(Of C1)
      For i = 1 To 10
       l.Add(New C1(i))
      Next
      Me.Source = l
     End Sub
    
    End Class
    
    Public Class C1
    
     Public Sub New(ByVal n As Integer)
      Me._timeOfDay = Now.AddDays(n)
     End Sub
    
     Private _timeOfDay As Date
     Public ReadOnly Property TimeOfDay As Date
      Get
       Return Me._timeOfDay
      End Get
     End Property
    
    End Class
    

    Wenn die TextBox im Beispiel mit TwoWay eingestellt wird, dann kommt Dein Fehler.

    --
    Viele Gruesse
    Peter

    Mittwoch, 7. Juli 2010 16:12
  • Hallo Theodor,

    ich kann das auch noch nicht nachvollziehen und vermute wie Peter, dass es ggf. am DataTemplate o.ä. liegt.

    MainWindow.xaml.cs:

     public partial class MainWindow : Window
     {
      public MainWindow()
      {
       InitializeComponent();
      }
    
      private void btnTest_Click(object sender, RoutedEventArgs e)
      {
       var ecv = FindResource("eineCollectionViewSource") as EineCollectionViewSource;
       List<Element> src = ecv.Source as List<Element>;
       MessageBox.Show("Nach Änderung des ersten Elementes: " + src[0].TimeOfDay);
      }
     }


    MainWindow.xaml:

    <Window 
     x:Class="WpfColViewDemo.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MainWindow" Height="350" Width="525"
     xmlns:local="clr-namespace:WpfColViewDemo">
    
     <Window.Resources>
      <local:EineCollectionViewSource x:Key="eineCollectionViewSource"/>
      <DataTemplate x:Key="ItemTemplate">
       <TextBox Width="100" Text="{Binding TimeOfDay, 
        Mode=TwoWay, StringFormat={}{0:yyyy-MM-dd}}"/>
      </DataTemplate>
     </Window.Resources>
    
     <Grid>
      <ListView 
    Margin="5,42.8,4,8" Grid.Row="1" x:Name="Listname" ItemsSource="{Binding .,Mode=OneWay, Source={StaticResource eineCollectionViewSource}}" ItemTemplate="{StaticResource ItemTemplate}" SelectedIndex="-1"/> <Button Content="Test" Height="23" Margin="0,12,4,0" Name="btnTest" VerticalAlignment="Top" HorizontalAlignment="Right" Width="53" Click="btnTest_Click" /> </Grid> </Window>


    EineCollectionViewSource.cs
     public class EineCollectionViewSource : CollectionViewSource
     {
      List<Element> elemente = new List<Element>();
    
      public EineCollectionViewSource()
      {
       for (int i = 0; i < 100; i++)
        elemente.Add(new Element() { TimeOfDay = DateTime.Now.AddDays(i) });
       this.Source = elemente;
      }
     }


    Element.cs:

     public class Element
     {
      public Element() { }
      public DateTime TimeOfDay { get; set; }
     }

    Insofern poste ggf. mal die zugehörige Klassen/Templates oder eine andere reproduizierbares Quellcodefragment.

     


    ciao Frank
    Mittwoch, 7. Juli 2010 17:52
  • Danke für eure schnellen Antworten, ich hatte schlicht und ergreifend den OneWay Mode nur in der ListView angegeben und nicht im DataTemplate. Jetzt funktioniert es.

    <DataTemplate x:Key="AppointmentItemTemplate">
          <Grid>
            <Grid.ColumnDefinitions>
              ...
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
              ...
            </Grid.RowDefinitions>
            <TextBlock Name="AppointtimeTB" TextWrapping="Wrap" Width="341" FontWeight="Bold" 
                  FontFamily="Arial" Height="16"
                  HorizontalAlignment="Left"><Run Language="de-de" Text="{Binding Path=datebegin.TimeOfDay, Mode=OneWay}"/>
            </TextBlock>
          </Grid>
        </DataTemplate>

    Vielen Dank

     

    Gruß

    Theodore

    Donnerstag, 8. Juli 2010 11:34

Alle Antworten

  • Ohne Dein DataTemplate zu kennen, vermute ich, dass dort zu der gebundenen Eigenschaft "TimeOfDay" explizit oder implite ein TwoWay angeben ist. Ich kann mit dem folgenden Codeschnipsel Dein Problem nicht reproduzieren:
     

    <Window x:Class="MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="350" Width="525"
         xmlns:vm="clr-namespace:WpfApplication1"
         >
     <Window.Resources>
      <vm:CVS x:Key="eine_collectionviewsource"/>
      <DataTemplate x:Key="ItemTemplate">
       <TextBox Text="{Binding TimeOfDay, Mode=OneWay}"/>
      </DataTemplate>
     </Window.Resources>
     <Grid>
      <ListView Margin="5,42.8,4,8" Grid.Row="1" x:Name="Listname" 
     		ItemsSource="{Binding .,Mode=OneWay, Source={StaticResource eine_collectionviewsource}}" 
     		ItemTemplate="{StaticResource ItemTemplate}"
     		SelectedIndex="-1"/>
     </Grid>
    </Window>
    

    Dazu der Modul mit den Daten:

    Public Class CVS
     Inherits CollectionViewSource
    
     Public Sub New()
      Dim l As New List(Of C1)
      For i = 1 To 10
       l.Add(New C1(i))
      Next
      Me.Source = l
     End Sub
    
    End Class
    
    Public Class C1
    
     Public Sub New(ByVal n As Integer)
      Me._timeOfDay = Now.AddDays(n)
     End Sub
    
     Private _timeOfDay As Date
     Public ReadOnly Property TimeOfDay As Date
      Get
       Return Me._timeOfDay
      End Get
     End Property
    
    End Class
    

    Wenn die TextBox im Beispiel mit TwoWay eingestellt wird, dann kommt Dein Fehler.

    --
    Viele Gruesse
    Peter

    Mittwoch, 7. Juli 2010 16:12
  • Hallo Theodor,

    ich kann das auch noch nicht nachvollziehen und vermute wie Peter, dass es ggf. am DataTemplate o.ä. liegt.

    MainWindow.xaml.cs:

     public partial class MainWindow : Window
     {
      public MainWindow()
      {
       InitializeComponent();
      }
    
      private void btnTest_Click(object sender, RoutedEventArgs e)
      {
       var ecv = FindResource("eineCollectionViewSource") as EineCollectionViewSource;
       List<Element> src = ecv.Source as List<Element>;
       MessageBox.Show("Nach Änderung des ersten Elementes: " + src[0].TimeOfDay);
      }
     }


    MainWindow.xaml:

    <Window 
     x:Class="WpfColViewDemo.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     Title="MainWindow" Height="350" Width="525"
     xmlns:local="clr-namespace:WpfColViewDemo">
    
     <Window.Resources>
      <local:EineCollectionViewSource x:Key="eineCollectionViewSource"/>
      <DataTemplate x:Key="ItemTemplate">
       <TextBox Width="100" Text="{Binding TimeOfDay, 
        Mode=TwoWay, StringFormat={}{0:yyyy-MM-dd}}"/>
      </DataTemplate>
     </Window.Resources>
    
     <Grid>
      <ListView 
    Margin="5,42.8,4,8" Grid.Row="1" x:Name="Listname" ItemsSource="{Binding .,Mode=OneWay, Source={StaticResource eineCollectionViewSource}}" ItemTemplate="{StaticResource ItemTemplate}" SelectedIndex="-1"/> <Button Content="Test" Height="23" Margin="0,12,4,0" Name="btnTest" VerticalAlignment="Top" HorizontalAlignment="Right" Width="53" Click="btnTest_Click" /> </Grid> </Window>


    EineCollectionViewSource.cs
     public class EineCollectionViewSource : CollectionViewSource
     {
      List<Element> elemente = new List<Element>();
    
      public EineCollectionViewSource()
      {
       for (int i = 0; i < 100; i++)
        elemente.Add(new Element() { TimeOfDay = DateTime.Now.AddDays(i) });
       this.Source = elemente;
      }
     }


    Element.cs:

     public class Element
     {
      public Element() { }
      public DateTime TimeOfDay { get; set; }
     }

    Insofern poste ggf. mal die zugehörige Klassen/Templates oder eine andere reproduizierbares Quellcodefragment.

     


    ciao Frank
    Mittwoch, 7. Juli 2010 17:52
  • Danke für eure schnellen Antworten, ich hatte schlicht und ergreifend den OneWay Mode nur in der ListView angegeben und nicht im DataTemplate. Jetzt funktioniert es.

    <DataTemplate x:Key="AppointmentItemTemplate">
          <Grid>
            <Grid.ColumnDefinitions>
              ...
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
              ...
            </Grid.RowDefinitions>
            <TextBlock Name="AppointtimeTB" TextWrapping="Wrap" Width="341" FontWeight="Bold" 
                  FontFamily="Arial" Height="16"
                  HorizontalAlignment="Left"><Run Language="de-de" Text="{Binding Path=datebegin.TimeOfDay, Mode=OneWay}"/>
            </TextBlock>
          </Grid>
        </DataTemplate>

    Vielen Dank

     

    Gruß

    Theodore

    Donnerstag, 8. Juli 2010 11:34