用户控制绑定属性改变MVVM
本文关键字:改变 MVVM 属性 绑定 控制 用户 | 更新日期: 2023-09-27 18:14:30
我正在使用WPF和使用数据绑定。
我想创建一个UserControl,它有一个可以用于数据绑定的属性。
另外,我想更新一些其他属性在UserControl如果属性改变。
例如,public class MyControl : UserControl
{
....
....
....
....
public ViewStyles CurrentView
{
get { return (ViewStyles)GetValue(CurrentViewProperty); }
set
{
SetValue(CurrentViewProperty, value);
UpdateView();
}
}
public static readonly DependencyProperty CurrentViewProperty = DependencyProperty.Register("CurrentView", typeof(ViewStyles), typeof(ComboView));
....
.....
.....
.....
}
问题是:
使用了ViewModel,其中有一个属性ViewStyle,它在上面绑定到CurrentView。
另一个控件组合框也在ViewModel中与ViewStyle进行了数据绑定。
实际上,我想使用一个组合框来选择控件的不同视图。如何在MVVM中实现?
我尝试了上面的方法。然而,UI (MyControl的不同ViewStyles)没有改变。只有当我用鼠标点击它时它才会改变。
谢谢。
XAML:(MyControl)
<Views:MyControl Grid.Column="1" Grid.Row="1" Height="505" HorizontalAlignment="Left" Margin="2,0,0,0" Name="comboView1" VerticalAlignment="Top" Width="983"
ViewStyle="{Binding Path=CurrentView}" BorderThickness="5" BorderBrush="Black" ItemsSource="{Binding Path=Images}"
SelectedIndex="{Binding Path=CurrentIndex}" Foreground="White"
</Views:MyControl>
XAML:(下拉列表框)
<ComboBox Margin="0,3,1,0" Width="178" HorizontalAlignment="Right" Name="ViewDDBox" FontSize="13" Foreground="#FFF6F3F3" Background="#FF444444"
BorderThickness="2" Height="23" VerticalAlignment="Top" Grid.Column="1"
ItemsSource="{Binding Path=ViewTypes}" IsEnabled="True" SelectedValue="{Binding Path=CurrentView, Mode=TwoWay}">
</ComboBox>
假设在组合框中选择后,MyControl的视图(一些UI效果)将被更改。但是现在,只有当我用鼠标点击MyControl时,它才会改变
你的CurrentView属性setter中的UpdateView()
发出了一个巨大的危险信号!在依赖属性设置器中,不应该包含SetValue
以外的任何内容,因为xaml的某些方面直接调用SetValue
,而不是通过属性。始终使用强制属性回调(如果您希望在设置数据之前验证数据)或属性更改回调(如果您希望在属性更改后执行操作,如下面的示例所示)。
你应该这样做:
public static DependencyProperty CurrentViewProperty =
DependencyProperty.Register("CurrentView", typeof(ViewStyles), typeof(ComboView),
new FrameworkPropertyMetadata(CurrentViewPropertyChanged));
private static void CurrentViewPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyControl mc = (MyControl)d;
mc.UpdateView();
}
与其绑定视图,为什么不创建一个模板化的控件,然后将控件的视图绑定到视图模型上的属性?
您可能还必须在模板上使用数据模板触发器来获得所需的功能。
查看这篇文章获取模板基础知识的帮助,这篇文章进行更深入的讨论。