2013-12-05 3 views
2

Спасибо. Надеюсь, я смогу загрузить все решение, потому что я подготовил его, прежде чем открывать этот вопрос. но я не нашел, как это сделать. Я скопирую весь код так, как только могу.WPF RadioButton известная проблема: почему старое значение свойства кажется обязательным после изменения свойства

Вопрос в следующем: Я думаю, что это простая реплицированная проблема в WPF. Я сделал простую версию кода, чтобы четко объяснить мой вопрос. Контейнер «TwoPersons» в образце имеет два экземпляра класса «Человек». Свойство «Current» будет представлять собой контекст данных детали. панель, которая заполняет подробную информацию о человеке. Я могу использовать метод тотализатора , чтобы прыгать между разными видами. Я могу видеть детали соответственно. Вопрос заключается в переключении и населяющего текущего человека, изменения пользовательского интерфейса изменяются (например, изменение мужчины до женщин), то изменение влияет на ПРЕДЫДУЩИЙ пункт, он был обязательным. Экземпляр persion будет изменен без изменений. Кажется, предыдущий экземпляр все еще имеет связь с представлением после привязки нового экземпляра. Как я могу избежать этой ситуации. Любая помощь будет оценена.

============================================================================================================================================================================== ============================

Это MainWindow.xaml.cs

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    TwoPersons twoPersons = new TwoPersons(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = twoPersons; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     twoPersons.Next(); 
    } 
} 

контейнер с двумя человек:

public class TwoPersons : INotifyPropertyChanged 
{ 
    Person p1 = new Person("Mary") { IsFemale = true }; 
    Person p2 = new Person("Luis") { IsMale = true }; 

    Person current; 

    public Person Current 
    { 
     get 
     { 
      if (current == null) 
       current = p1; 

      return current; 
     } 

     set 
     { 
      if (current != value) 
      { 
       current = value; 
       OnPropertyChanged("Current"); 
      } 
     } 
    } 

    public void Next() 
    { 
     Current = Current == p1 ? p2 : p1; 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName); 
      PropertyChanged(this, e); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

человек класс:

public class Person : INotifyPropertyChanged 
{ 
    public Person(string name) 
    { 
     this.name = name; 
    } 

    private string name; 
    public string Name 
    { 
     get { return name; } 
    } 

    public bool isMale; 
    public bool IsMale 
    { 
     get { return isMale; } 
     set 
     { 
      if (isMale != value) 
      { 
       isMale = value; 
       OnPropertyChanged("IsMale"); 
       OnPropertyChanged("IsFemale"); 
       OnPropertyChanged("Description"); 
      } 
     } 
    } 

    public bool IsFemale 
    { 
     get { return !isMale; } 
     set { IsMale = !value; } 
    } 

    public string Description 
    { 
     get 
     { 
      return isMale ? "Male" : "Female"; 
     } 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName); 
      PropertyChanged(this, e); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Главное окно XAML

<Grid> 
    <StackPanel DataContext="{Binding Current}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
     <RadioButton IsChecked="{Binding IsMale}">Male</RadioButton> 
     <RadioButton IsChecked="{Binding IsFemale}">Female</RadioButton> 
     <TextBlock Text="{Binding Description}"></TextBlock> 
     <Button Click="Button_Click" Height="32">Next >></Button> 
     <TextBlock>Note. Mary should be alway a female! But it changes when navigating by clicking the button above </TextBlock> 
    </StackPanel> 
</Grid> 
+0

Ваш вопрос не является достаточно ясным, что привязка не работает должным образом? – makc

+0

Да, довольно сложно понять, что именно не так. XAML, который позволяет воспроизвести проблему, будет лучшим. – Somedust

+0

@Somedust ... попробуйте прокрутить вниз, чтобы увидеть XAML. – Sheridan

ответ

1

Когда вы задаете вопрос один StackOverflow, вы действительно должен предоставить все кода, необходимого для воспроизведения проблемы. Первая причина, по которой вы должны сделать это, - это то, что люди, которые пытаются вам помочь, не должны терять время, воспроизводя свой код вручную.

Вторая, более важная причина в том, что когда я должен был воспроизвести вашу ошибку с помощью своего собственного кода (для битов кода, которые вы не показывали, например, класса Person), я правильно реализовал код, поэтому ваш примерный код работает для меня отлично.

Поэтому я могу только предположить, что у вас есть ошибка в вашем классе Person, но, поскольку вы этого не показали, я не могу подтвердить это. Лучше всего предположить, что вы просто не реализовали INotifyPropertyChanged правильно в классе Person или, возможно, даже в вашем основном классе. Когда вы это сделаете, вы должны обнаружить, что ваш код работает нормально.

+0

+1 время, которое вы взяли для воспроизведения, и вы, вероятно, правы, и его класс человека виноват – makc

0

Так же, как вы, я сначала думал, что твоя проблема была вызвана порядком, в котором выполняются привязки, в сочетании с тем, что связыванием режима для некоторых свойств по умолчанию в TwoWay:

Тока теперь " Луи », но привязка по-прежнему смотрит на« Мэри »

Но тогда я заменил ваши два RadioButtons на CheckBox, и все сработало, как ожидалось.

Итак, я начал искать проблемы с контролем RadioButton, и я наткнулся на этот StackOverflow вопрос (и многие другие):

Radiobutton wpf binding

Замена Radiobuttons в вашем примере с RadioButtonExtended найдено в ответ на этот вопрос и привязка к IsCheckedExt вместо IsChecked, исправлена ​​проблема. Итак, кажется, что ваши проблемы вызваны ошибкой в ​​элементе управления RadioButton.

<local:RadioButtonExtended IsCheckedExt="{Binding IsMale}">Male</local:RadioButtonExtended> 
<local:RadioButtonExtended IsCheckedExt="{Binding IsFemale}">Female</local:RadioButtonExtended>