2016-12-27 60 views
4

我正在制作一个WPF项目并试图坚持使用MVVM模式。它接近20 UserControl s,每个约10控件我想能够改变属性。对于每一个,我需要能够更改VisibilityIsEnabled(框架元素属性),然后更改内容/文本。每个控件至少有3个属性。在所有UserControl s,这使得600属性...MVVM太多属性

我玩弄了ControlProperties类的想法,并让每个控件绑定到适当的实例的成员变量/属性。 (例如)

//Code-behind 
public class ControlProperties 
{ 
    private bool m_isEnabled; 
    public property IsEnabled 
    { 
     get { return m_isEnabled; } 
     set { m_isEnabled = value; notifyPropertyChanged("IsEnabled"); } 
    } 

    ControlProperties() { m_isEnabled = false; } 
} 

public ControlProperties controlOne; 


//XAML 
<Button IsEnabled={Binding controlOne.IsEnabled}/> 

有没有办法来每个控件的属性2+结合成东西比使用上述类的可重用性/更容易实现,其他的? (每个控件需要它自己的“实例”,它们没有共享相同的值)上述方法的一个缺点是每个控件都必须单独绑定想要的属性。我必须首先...但仍然。

如果我遗漏任何东西或对某些事物不清楚,请提问。

+0

从你XAML的例子是你的datacontext controlProperties? 如果是这样,乍一看,我会建议反对它 –

+0

'Button'所在的'UserControl'将其'DataContext'设置为我的ViewModel。 –

+0

不确切知道控件的含义。我从来没有使用过CustomControls,只有Controls;如果您没有特定的XAML控件来绑定这两个属性,我将显式绑定所有内容 如果两个待绑定的属性可以封装在“通用”控件中,那么该控件就不需要穿越障碍 –

回答

0

有没有办法将每个控件的2+属性组合成更可重用/更容易实现的东西,除了使用上面的类?

我不知道,我明白究竟你是什么这里经过,但你可能要考虑使用一个或多个连接的依赖属性:https://msdn.microsoft.com/en-us/library/ms749011(v=vs.110).aspx

这样的属性可以在一个单独的类中定义:

namespace WpfApplication1 
{ 
    public class SharedProperties 
    { 
     public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached(
      "IsEnabled", 
      typeof(bool), 
      typeof(SharedProperties), 
      new FrameworkPropertyMetadata(false)); 

     public static void SetIsEnabled(UIElement element, bool value) 
     { 
      element.SetValue(IsEnabledProperty, value); 
     } 
     public static bool GetIsEnabled(UIElement element) 
     { 
      return (bool)element.GetValue(IsEnabledProperty); 
     } 
    } 
} 

...然后在任意的UIElement设置:

<Window x:Class="WpfApplication1.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="Window21" Height="300" Width="300"> 
    <StackPanel> 
     <UserControl local:SharedProperties.IsEnabled="True" /> 

     <Button x:Name="btn" local:SharedProperties.IsEnabled="{Binding SomeSourceProperty}" /> 
    ... 

//get: 
bool isEnabled = SharedProperties.GetIsEnabled(btn); 
//set: 
SharedProperties.SetIsEnabled(btn, true); 
+0

每个控件都需要使用自己的“实例”。我没有在所有人中分享相同的价值。我相应地更新了我的问题 –

+0

我猜你没看过链接。依赖性属性的值不是*在控件中共享。每个控制都有自己的价值,但财产本身只能在一个地方定义一次。请参阅我提供的链接了解更多信息。 – mm8