【问题标题】:Usercontrol databinding property changed MVVM用户控件数据绑定属性更改了 MVVM
【发布时间】:2011-11-15 06:02:55
【问题描述】:

我正在使用 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:(我的控件)

<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>

假设在Combobox中选择后MyControl的视图(一些UI效果)会发生变化。但是现在,只有当我使用鼠标单击 MyControl 时它才会改变。

【问题讨论】:

  • 能否发一些数据绑定的xaml代码?

标签: c# wpf data-binding mvvm


【解决方案1】:

CurrentView 属性设置器中的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();
}

【讨论】:

  • 非常感谢您的帮助。但是,它仍然不起作用....实际上,MyControl实际上是一个经过修改的ListView。在 ListView 的编码中添加了一个 GridView。当 UpdateView 被调用时,View(ListView 的一个属性)被分配为一个新的 GridView(即 View = new GridView())。在赋值之前,对新添加的GridView进行了修改,进一步增强.....
  • 如果我放弃 MVVM,改用 eventHandler 就可以了。但是我想尽量使用MVVM。
【解决方案2】:

为什么不创建一个模板化控件,然后将控件的视图绑定到视图模型上的属性,而不是绑定视图?

您可能还必须在模板上使用数据模板触发器才能获得所需的功能。

查看this article 以获得有关模板基础知识的帮助,查看this one 以获得更深入的讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2014-09-05
    • 2013-08-29
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多