我正在开始 WPF,并且在实现数据绑定方面遇到了一些困难。
具体来说,我创建了一个简单的用户控件,其中包含一个标签和一个按钮。
对于这个用户控件,我创建了一个 ViewModel,它只包含两个属性,string
“文本”和SimpleEnum
“地位”。
该控件的目的是显示某事物的状态,例如“已连接”是/否等。按钮的背景颜色指示状态。
我的 XAML 看起来像这样
<Control.DataContext>
<vm:OnOffStatusViewModel />
</Control.DataContext>
<Label x:Name="label1" Height="Auto" HorizontalAlignment="Left" Content="{Binding Text}" Width="280" />
<Button Style="{StaticResource GlassButton}" Height="14" Width="14" Background="{Binding Status}" Grid.Column="1" />
with xmlns:vm="clr-namespace:Controls"
代码隐藏有一个属性ViewModel
公开视图模型,实现 INotifyPropertyChanged,并初始化为_viewModel = (OnOffStatusViewModel) DataContext;
现在,在我看来,使用此控件时,我已成功将文本设置为某些内容,因为我在实现视图代码隐藏中具有onOffStatus1.ViewModel.Text = ...
但是,状态是通过枚举设置的,因此不能真正绑定到按钮的背景属性。
我的问题与此相关:
我控制的方式正确吗?如果不是,在用户控件中实现数据绑定的正确方法是什么?
如何让我的枚举状态使用绑定更新按钮的背景属性?
如何让我的枚举状态使用绑定更新按钮的背景属性?
建议使用值转换器 http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx对于此任务,为枚举的每个可能值返回画笔。这样,您的视图模型不需要了解有关颜色或画笔的任何信息,并且您可以在任何想要可视化状态的地方使用转换器。
XAML
<UserControl x:Class="WpfApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<UserControl.Resources>
<local:StatusColorConverter x:Key="StatusColorConverter" />
</UserControl.Resources>
<Button Background="{Binding Status, Converter={StaticResource StatusColorConverter}" />
</UserControl>
转换器
public enum Status
{
Connected
}
public class StatusColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch ((Status)value)
{
case Status.Connected: return new SolidColorBrush(Colors.Green);
}
return new SolidColorBrush(Colors.Black);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我控制的方式正确吗?如果不是,正确的是什么
在用户控件中实现数据绑定的方法?
你的实施对我来说似乎很好。您可能希望通过依赖注入消除视图模型和视图(当前保存对视图模型的引用)之间的耦合。但这取决于您的用例和您想要使用的架构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)