none
Databinding Problem RRS feed

  • Frage

  • Hallo,

    in einem MVVM Projekt (SimpleMVVM)

    in einer Suchliste wird ein Objekt ausgewählt.

    Dann Sende ich eine Nachricht die meine DetailView empfängt (DesignChanged).

    Dort lade ich ein Design von meinem Repository und weise dieses dem ViewModel (SelectedDesign) zu.

    Mein SelectedDesign hat eine Property (AloyDto) die ich an eine Combobox binde.

    Wenn sich jetzt mein SelectedDesign ändert wird der SelectedItem-Wert der Combobox nicht aktualisiert.)

    Wer kann helfen?

    Mit Bestem Dank im Vorraus

    Jens

    ViewModel:

    private DesignDto _selectedDesign;
    public DesignDto SelectedDesign
    {
     get { return _selectedDesign; }
        set
      {
       _selectedDesign = value;
                NotifyPropertyChanged(m => SelectedDesign);
                _logger.Trace("Design Changed. Data: {0}", _selectedDesign);
            }
    }

    private ObservableCollection<AloyDto> _aloys;
    public ObservableCollection<AloyDto> Aloys
    {
     get { return _aloys; }
     set { _aloys = value; NotifyPropertyChanged(m => m.Aloys); }
    }

    private void DesignChanged(object sender, NotificationEventArgs<Models.DesignChangedMessage> e)
    {
     try
     {
      // Design laden
      SelectedDesign = serviceAgent.LoadDesign(e.Data.Result.Id);
     }
     catch (Exception ex)
     {
     }
    }

    View:

    <ComboBox Grid.Row="17" Grid.Column="3"
        SelectedItem="{Binding SelectedDesign.Aloy}"
        ItemsSource="{Binding Aloys}" >
     <ComboBox.ItemTemplate>
      <DataTemplate>
       <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Id}" />
        <TextBlock Text="{Binding Nr}" Margin="5,0,0,0" />
        <TextBlock Text="{Binding ShortDescription}" Margin="5,0,0,0" FontWeight="Bold" />
       </StackPanel>
      </DataTemplate>
     </ComboBox.ItemTemplate>
    </ComboBox>

    Montag, 3. Februar 2014 14:20

Antworten

  • Hi,
    mit dem SelectedItem gibt es Probleme; ich weiß nicht warum. Eine funktionierende Lösung für Dich könnte so aussehen (Bindung an SelectedValue):

    Bindung im DetailView:

    ...

    <TextBlock Text="Aloy:" Grid.Row="2" Grid.Column="0"/> <!--<ComboBox ItemsSource="{Binding Aloys}" SelectedItem="{Binding SelectedDesignDto.AloyDto.Id}" Grid.Row="2" Grid.Column="1" />--> <ComboBox ItemsSource="{Binding Aloys}" SelectedValue="{Binding SelectedDesignDto.AloyDto_Id, Mode=OneWay}" SelectedValuePath="Id" Grid.Row="2" Grid.Column="1" />

    ...

    Und dazu ergänzend eine Eigenschaft, die die Id des aktuellen Objektes aus der Navigation bereitstellt im DesignDto.cs:

    ...

    private AloyDto _aloyDto; public AloyDto AloyDto { get { return this._aloyDto; } set { this._aloyDto = value; OnPropertyChanged(() => this.AloyDto); } } public int AloyDto_Id { get { return _aloyDto.Id; } } }


    --
    Peter
    • Als Antwort vorgeschlagen Peter Fleischer Montag, 24. März 2014 09:23
    • Als Antwort markiert Kermitfrosch Montag, 24. März 2014 11:01
    Montag, 24. März 2014 09:23

Alle Antworten

  • Hi,
    Dein Codeauszug funktioniert bei mir wie gewünscht. Es wird bei Dir an einer anderen Stelle das Problem liegen. Hier meine angepasste Demo:

    <Window x:Class="WpfApplication3.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:WpfApplication3">
      <Window.Resources>
        <local:ViewModel x:Key="vm"/>
      </Window.Resources>
      <StackPanel DataContext="{Binding Source={StaticResource vm}}">
        <Button Content="Start" Click="Button_Click" />
        <ComboBox Grid.Row="17" Grid.Column="3" 
         SelectedItem="{Binding SelectedDesign.Aloy}" 
         ItemsSource="{Binding Aloys}" >
          <ComboBox.ItemTemplate>
            <DataTemplate>
              <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Id}" />
                <TextBlock Text="{Binding Nr}" Margin="5,0,0,0" />
                <TextBlock Text="{Binding ShortDescription}" Margin="5,0,0,0" FontWeight="Bold" />
              </StackPanel>
            </DataTemplate>
          </ComboBox.ItemTemplate>
        </ComboBox>
      </StackPanel>
    </Window>

    Und der CodeBehind:

    using System;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Windows;
    
    namespace WpfApplication3
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
          var vm = this.Resources["vm"] as ViewModel;
          vm.DesignChanged();
        }
      }
    
      class ViewModel : INotifyPropertyChanged
      {
        public ViewModel()
        {
          Aloys = new ObservableCollection<AloyDto>();
          for (int i = 0; i < 10; i++)
          {
            Aloys.Add(new AloyDto { Id = i, Nr = i, ShortDescription = i.ToString() });
          }
        }
    
        Random rnd = new Random();
    
        private DesignDto _selectedDesign;
        public DesignDto SelectedDesign
        {
          get { return _selectedDesign; }
          set
          {
            _selectedDesign = value;
            NotifyPropertyChanged("SelectedDesign");
          }
        }
    
        private ObservableCollection<AloyDto> _aloys;
        public ObservableCollection<AloyDto> Aloys
        {
          get { return _aloys; }
          set { _aloys = value; NotifyPropertyChanged("Aloys"); }
        }
    
        //private void DesignChanged(object sender, NotificationEventArgs<Models.DesignChangedMessage> e)
        public void DesignChanged()
        {
          try
          {
            // Design laden
            SelectedDesign = new DesignDto() { Aloy = Aloys[rnd.Next(0, Aloys.Count)] }; // serviceAgent.LoadDesign(e.Data.Result.Id);
          }
          catch (Exception ex)
          {
          }
        }
    
        void NotifyPropertyChanged(string propName)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
          }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
      }
    
      class AloyDto
      {
        public int Id { get; set; }
        public int Nr { get; set; }
        public string ShortDescription { get; set; }
      }
    
      class DesignDto
      {
        public AloyDto Aloy { get; set; }
      }
    }

    --
    Peter

    Montag, 3. Februar 2014 15:40
  • Hallo Peter,

    das Problem scheint bei mir in der Datenquelle

    zu liegen. Ich hab mal ein kleines Projekt hochgeladen um das Problem

    nachzustellen.

    http://sdrv.ms/1c7LeuG

    Vielen Dank für die Mühe

    Jens

    Donnerstag, 6. Februar 2014 20:19
  • Hi,
    mit dem SelectedItem gibt es Probleme; ich weiß nicht warum. Eine funktionierende Lösung für Dich könnte so aussehen (Bindung an SelectedValue):

    Bindung im DetailView:

    ...

    <TextBlock Text="Aloy:" Grid.Row="2" Grid.Column="0"/> <!--<ComboBox ItemsSource="{Binding Aloys}" SelectedItem="{Binding SelectedDesignDto.AloyDto.Id}" Grid.Row="2" Grid.Column="1" />--> <ComboBox ItemsSource="{Binding Aloys}" SelectedValue="{Binding SelectedDesignDto.AloyDto_Id, Mode=OneWay}" SelectedValuePath="Id" Grid.Row="2" Grid.Column="1" />

    ...

    Und dazu ergänzend eine Eigenschaft, die die Id des aktuellen Objektes aus der Navigation bereitstellt im DesignDto.cs:

    ...

    private AloyDto _aloyDto; public AloyDto AloyDto { get { return this._aloyDto; } set { this._aloyDto = value; OnPropertyChanged(() => this.AloyDto); } } public int AloyDto_Id { get { return _aloyDto.Id; } } }


    --
    Peter
    • Als Antwort vorgeschlagen Peter Fleischer Montag, 24. März 2014 09:23
    • Als Antwort markiert Kermitfrosch Montag, 24. März 2014 11:01
    Montag, 24. März 2014 09:23