【发布时间】: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 中调用
GetValue和SetValue方法(即您的CheckTextBoxes()调用)。原因在XAML Loading and Dependency Properties 中有解释。相反,使用属性的元数据注册一个 PropertyChangedCallback。 -
@Clemens 是的,我的意思是 TaskValue。但是如何更改其他文本框的可见性?我什至尝试过个人电话。但是没有运气。你能给我一些建议吗?
-
什么时候调用这个 CheckTextBoxes() 方法?我的意思是从什么时候开始?
-
@KyloRen 我想也许在绑定用户控件时,TaskValue 会调用 CheckTextBoxes(),并且在调用相应的文本框后,可以相应地更改可见性。
标签: c# wpf windows xaml user-controls