создание пользовательского элемента управления в wpf и синхронизация с выбранным элементом - PullRequest
0 голосов
/ 28 июня 2011

ОК - Так что у меня почти все работает.Мне просто нужно знать, кто должен получить usercontrol, чтобы сообщить модели представления потребляющего представления, что произошли изменения.Проверьте это - вот XAML с точки зрения потребления.

  <StackPanel>
    <pfControls:TriChoiceUserControl Text="{Binding Path=SampleText}" State="{Binding CurrentState}"/>
    </StackPanel>

Вот код модели представления

class MainWindowViewModel: INotifyPropertyChanged

{private bool?Текущее состояние;публичный бул?CurrentState {get {return currentState;} set {currentState = value;OnPropertyChanged ( "CurrentState");}}

public string SampleText  { get { return "Hi there"; }  }

public MainWindowViewModel()
{
  CurrentState = false;
}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string name)
{
  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
    handler(this, new PropertyChangedEventArgs(name));
  }
}

}

Теперь при начальной загрузке ViewModel вы можете видеть, что текущее состояние имеет значение false, и действительно элемент управления I заканчивается с установленным флажком false (естьтри флажка, один для да, один для нет и один для на - не спрашивайте меня, это то, что они сказали мне делать).Проблема состоит в том, что когда я проверяю первый (в данном случае true), пользовательский элемент управления работает так, что он отключает и снимает флажок false, но и изменяет свойство состояния, но моя модель представления для потребляющего представления никогда не получает уведомления.Я чувствую, что я так близко ... Вот код для управления пользователем.

 public partial class TriChoiceUserControl : UserControl, INotifyPropertyChanged

{#region Fields (5)

public static readonly DependencyProperty StateProperty = DependencyProperty.Register("State", typeof(bool?), typeof(TriChoiceUserControl), 
  new FrameworkPropertyMetadata(new PropertyChangedCallback(ChangeState)));
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(TriChoiceUserControl), 
  new FrameworkPropertyMetadata(new PropertyChangedCallback(ChangeText)));

    #endregion Fields 


public TriChoiceUserControl()
{
  InitializeComponent();
}


public bool? State
{
  get
  {
    return (bool?)GetValue(StateProperty);
  }
  set
  {
    SetValue(StateProperty, value);
    NotifyPropertyChanged("State");
  }
}

public string Text
{
  get
  {
    return (string)GetValue(TextProperty);
  }
  set
  {
    SetValue(TextProperty, value);
  }
}

private static void ChangeState(DependencyObject source, DependencyPropertyChangedEventArgs e)
{

  (source as TriChoiceUserControl).UpdateCheckState((bool?)e.NewValue);
}

private static void ChangeText(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
  (source as TriChoiceUserControl).UpdateText(e.NewValue.ToString());
}

private void UpdateText(string newText)
{
  label1.Content = newText;
}

private void UpdateCheckState(bool? newState)
{
  if (newState != null)
  {
    if ((bool)newState)
    {
      chkYes.IsChecked = true;
      chkNo.IsChecked = false;
      chkNa.IsChecked = false;
    }
    else
    {
      chkYes.IsChecked = false;
      chkNo.IsChecked = true;
      chkNa.IsChecked = false;
    }
  } 
  else
  {
    chkYes.IsChecked = false;
    chkNo.IsChecked = false;
    chkNa.IsChecked = true;
  }
  State = newState;
}


private void chkYes_Checked(object sender, RoutedEventArgs e)
{
  UpdateCheckState(true);
}

private void chkNo_Checked(object sender, RoutedEventArgs e)
{
  UpdateCheckState(false);
}

private void chkNa_Checked(object sender, RoutedEventArgs e)
{
  UpdateCheckState(null);
}

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
  if (PropertyChanged != null)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(info));
  }
}

}

Вот XAML для пользовательского элемента управления.

Спасибо за любой вклад.

1 Ответ

0 голосов
/ 01 июля 2011

Все это работает просто отлично, я упустил из виду тот факт, что режимом по умолчанию является «oneWay» на привязке - duh - я установил Mode = TwoWay и не все работаетНо это нормально, я не против сказать дух, обычно это означает, что я нашел ответ :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...