【问题标题】:Change the visibility of usercontrols as per the enum根据枚举更改用户控件的可见性
【发布时间】:2016-05-10 11:22:46
【问题描述】:

我创建了一个枚举

  public enum TaskVal
    {
    NotStarted,
    InProgress,
    Completed
    }

现在我已经在带有文本框的 xaml 中创建了一个用户控件。我维护了所有的 xaml 绑定路径。这看起来像

<ListView  Name="ListOfTasks"  BorderThickness="0" ScrollViewer.CanContentScroll="True" >
      <ListView.ItemTemplate>
          <DataTemplate>
             <userControls:Work Task="{Binding TaskValue=TaskValues}" />
          </DataTemplate>
      </ListView.ItemTemplate>
</ListView>

实现的c#模型的后端是

 public class TaskModel
 {
    public TaskVal TaskValues {get;set;}
 }

这是在 xaml 页面中实现的登录

List<TaskVal> _list=new List<TaskVal>();
_list.Add(new TaskModel(){TaskValues=TaskVal.NotStarted});
_list.Add(new TaskModel(){TaskValues=TaskVal.InProgress});
_list.Add(new TaskModel(){TaskValues=TaskVal.NotStarted});
_list.Add(new TaskModel(){TaskValues=TaskVal.Completed});
_list.Add(new TaskModel(){TaskValues=TaskVal.InProgress});
_list.Add(new TaskModel(){TaskValues=TaskVal.NotStarted});

ListOfTasks.ItemsSource=_list;

在用户控件中我定义了依赖属性

public TaskVal TaskValue
{
    get 
    {
       return (TaskVal)GetValue(TaskValueProperty);
    }
    set
    {
       CheckTextBoxes();
       SetValue(TaskValueProperty, value);
     }
 }



public static readonly DependencyProperty TaskValueProperty =
            DependencyProperty.Register("TaskValue", typeof(TaskVal),
              typeof(WorkUserControl), new PropertyMetadata(TaskVal.NotStarted));

CheckTextBoxes 函数是这样的

public void CheckTextBoxes()
{
   switch(TaskValue)
   {
      case NotStarted:
         Textbox1.Visibility=Visibility.Visible;
         TextBox2.Visibility=Visibility.Collapsed;
         TextBox3.Visibility=Visibility.Collapsed;
         break;
      case InProgress:
         Textbox1.Visibility=Visibility.Collapsed;
         TextBox2.Visibility=Visibility.Visible;
         TextBox3.Visibility=Visibility.Collapsed;
         break;
      case Completed:
         Textbox1.Visibility=Visibility.Collapsed;
         TextBox2.Visibility=Visibility.Collapsed;
         TextBox3.Visibility=Visibility.Visible;
         break;
      default:
         break;

   }
}

问题是它只使用 TaskVal Enum 的默认值。 TaskVal 的其他值不起作用。有什么需要注意的吗?

【问题讨论】:

  • 当你写Task="{Binding TaskValue=TaskValues}"时,你可能是想写TaskValue="{Binding Path=TaskValues}"
  • 除此之外,您不应该在依赖属性的 CLR 包装器的 getter 和 setter 中调用 GetValueSetValue 方法(即您的 CheckTextBoxes() 调用)。原因在XAML Loading and Dependency Properties 中有解释。相反,使用属性的元数据注册一个 PropertyChangedCallback。
  • @Clemens 是的,我的意思是 TaskValue。但是如何更改其他文本框的可见性?我什至尝试过个人电话。但是没有运气。你能给我一些建议吗?
  • 什么时候调用这个 CheckTextBoxes() 方法?我的意思是从什么时候开始?
  • @KyloRen 我想也许在绑定用户控件时,TaskValue 会调用 CheckTextBoxes(),并且在调用相应的文本框后,可以相应地更改可见性。

标签: c# wpf windows xaml user-controls


【解决方案1】:

CheckTextBoxes() 只能在用户控件完全加载后调用,即在 usercontrol_loaded() 上调用此函数。

private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            CheckTextBoxes();
        }

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2016-01-06
    • 1970-01-01
    • 2013-07-22
    • 2011-07-13
    • 2015-12-31
    • 1970-01-01
    • 2011-06-29
    • 2023-04-09
    相关资源
    最近更新 更多