在wpf中创建客户用户控件并与所选项同步

时间:2011-06-28 17:38:39

标签: wpf mvvm

好的 - 所以我几乎有这个工作。我只需要知道谁将获取usercontrol以让消费视图的viewmodel知道发生了变化。检查一下 - 这是消费视图中的xaml。

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

这是viewmodel代码

class MainWindowViewModel: INotifyPropertyChanged

{     私人布尔?当前状态;     公共布尔?当前状态     {       get {return currentState; }       设置{         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复选框(有三个复选框,一个用于yes,一个用于no,一个用于na - 不要问我,这就是他们告诉我的事情)。问题是,当我检查第一个(在这种情况下为true)时,用户控件正在工作,它取消并取消选中false复选框,但是更改了state属性,但我的用户视图的viewmodel永远不会得到通知。我觉得我太近了......这是用户控件的代码。

 public partial class TriChoiceUserControl : UserControl, INotifyPropertyChanged

{         #地区域(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 :(得分:0)

所有这一切都很好,我已经忘记了绑定时默认模式是“oneWay”的事实 - 呃 - 我设置Mode = TwoWay并且没有一切正常。但那没关系,我不介意说呃,这通常意味着我找到了答案:)