Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在wpf中创建客户用户控件并与所选项目同步_Wpf_Mvvm - Fatal编程技术网

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

在wpf中创建客户用户控件并与所选项目同步,wpf,mvvm,Wpf,Mvvm,好的,我几乎可以让它工作了。我只需要知道是谁让usercontrol让消费视图的viewmodel知道发生了变化。看看这个-这是消费视图中的xaml <StackPanel> <pfControls:TriChoiceUserControl Text="{Binding Path=SampleText}" State="{Binding CurrentState}"/> </StackPanel> { 私有布尔州; 公共布尔?当前状态 {

好的,我几乎可以让它工作了。我只需要知道是谁让usercontrol让消费视图的viewmodel知道发生了变化。看看这个-这是消费视图中的xaml

  <StackPanel>
    <pfControls:TriChoiceUserControl Text="{Binding Path=SampleText}" State="{Binding CurrentState}"/>
    </StackPanel>
{ 私有布尔州; 公共布尔?当前状态 { 获取{return currentState;} 集合{ 当前状态=值; OnPropertyChangedCurrentState; } }

}

现在,在ViewModel的初始加载中,您可以看到当前状态为false,实际上,我最终选中了false复选框的控件有三个复选框,一个表示是,一个表示否,一个表示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

 public partial class TriChoiceUserControl : UserControl, INotifyPropertyChanged


感谢您的输入。

所有这些都可以正常工作,我忽略了一个事实,即绑定上的默认模式是单向的-duh-I set mode=TwoWay,没有任何东西可以正常工作。但是,好的,我不介意说duh,这通常意味着我已经找到了答案:

您是否查看了跟踪以查看输出窗口中是否存在任何绑定错误?是的,这不是问题所在。有一个绑定错误,我非常兴奋,但是您看到的当前State绑定并没有产生错误,它只是没有做任何事情。
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));
  }
}