2016-12-27 89 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