tags:

views:

51

answers:

3

I've got some bindings in UI:

   <Window x:Class="Tester.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="377" Width="562" xmlns:my="clr-namespace:MyApp">
        <Grid>
        <TextBlock Text="{Binding Path=current.Text}"  Name="Text1" />
        <TextBlock Text="{Binding Path=current.o.Text}"  Name="Text2"  />

</Grid>
</Window>

Code:

class Coordinator : INotifyPropertyChanged{
     List<Myclass1> list;
     int currId = 0;
     public Myclass1 current{
              return list[currId];
           }
     public int CurrId
    {
        get { return currId; }
        set
        {
                currId = value;
                this.PropertyChanged(this,new PropertyChangedEventArgs("current"));


         }
}
class Myclass1{
     public string Text{get;}
     public Myclass2 o{get;}
}

class Myclass2{
     public string Text{get;}
}

When currId changes Tex1 in UI changes too,but Text2 doesn't.

I'm assuming this happens because Text2's source isn't updated. Does anyone know how to fix it?

A: 

I'm not sure if this is what you are looking for, but for something similar I used the PropertyObserver class from Josh Smith's MVVM framework.

kenny
A: 

It should work assuming you implement your classes properly. With some fixes my code looks like this:

<Window x:Class="WpfBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel>
        <TextBlock Text="Enter 0, 1 or 2 below and press Tab:"/>
        <TextBox Text="{Binding CurrId}"/>
        <Button/> <!--Button here is just for another tab stop-->
        <TextBlock Text="{Binding Path=current.Text}"  Name="Text1" />
        <TextBlock Text="{Binding Path=current.o.Text}"  Name="Text2"  />
    </StackPanel>
</Grid>
</Window>

it works fine with classes implemented like this:

public partial class Window1: Window {
    public Window1() {
        InitializeComponent();
        DataContext = new Coordinator();
    }
}

class Coordinator: INotifyPropertyChanged {
    List<Myclass1> list;
    int currId = 0;

    public Myclass1 current {
        get { return list[currId]; }
    }

    public int CurrId {
        get { return currId; }
        set {
            currId = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("current"));
        }
    }

    public Coordinator() {
        list = new List<Myclass1>(){
            new Myclass1(){ Text = "1", o = new Myclass2(){Text="1.1"}},
            new Myclass1(){ Text = "2", o = new Myclass2(){Text="2.2"}},
            new Myclass1(){ Text = "3", o = new Myclass2(){Text="3.3"}}
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

class Myclass1 {
    public string Text { get; set; }
    public Myclass2 o { get; set; }
}

class Myclass2 {
    public string Text { get; set; }
}
Stanislav Kniazev
A: 

Maybe you need to implement INotifyPropertyChanged in Myclass2 also.

John
Why not try it? It works as it is, the problem is somewhere else.
Stanislav Kniazev