2013-04-04 53 views
0

我目前正在嘗試遵循C#4中的MVVM,但遇到了綁定工作的麻煩。C#綁定無法使用屬性<T>

從底部開始,這裏是我的財產類應該照顧性質的改變XAML綁定:

namespace Visualizer.MVVM 
{ 
    public class Property<T> : DependencyObject, INotifyPropertyChanged 
    { 
     //private T _Value; 
     public T Value 
     { 
      get { return (T) GetValue(ValueProperty); } 
      set 
      { 
       SetValue(ValueProperty, value); 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged() 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs("Value")); 
      } 
     } 

     public Property(T val) 
     { 
      Value = val; 
     } 

     public static readonly DependencyProperty ValueProperty = 
      DependencyProperty.Register("Value", typeof(T), typeof(Property<T>)); 
    } 
} 

我對控制視圖模型看起來像這樣在MainWindow.xaml被實例化的.cs:

public class CheckboxControlVM 
{ 
    public Property<bool> IsChecked { get; set; } 
    public Property<string> Name { get; set; } 

    public CheckboxControlVM(bool isChecked, string name) 
    { 
     IsChecked = new Property<bool>(isChecked); 
     Name = new Property<string>(name); 
    } 
} 

控制沒有代碼隱藏,所以這裏是它的XAML:

<UserControl x:Class="Visualizer.MVVM.Checkbox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Visualizer.MVVM" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel Orientation="Horizontal" x:Name="LayoutRoot"> 
     <CheckBox IsChecked="{Binding Path=IsChecked.Value, Mode=TwoWay}"/> 
     <TextBlock Text="{Binding Path=Name.Value, Mode=OneWay}"/> 
    </StackPanel> 
</UserControl> 

最後,這裏是MainWindow.xaml綁定:

<mvvm:Checkbox DataContext="{Binding Realtime}"/> 

我一直停留在這了很多的時間比我要和我相當肯定它只是一個簡單的問題。有任何想法嗎?

+0

並注意:也沒有綁定錯誤。 – HoboSteaux 2013-04-04 05:05:48

回答

0

試試這個

public class CheckboxControlVM 
    { 
    bool _isChecked = false; 
    string _name ; 
    public Property<bool> IsChecked { get { return _isChecked} set { _isChecked=value;} } 

    public Property<string> Name { get { return _name } set { _name =value;} } 

    public CheckboxControlVM(bool isChecked, string name) 
    { 
    _isChecked = isChecked; 
    _name = name; 
    IsChecked = new Property<bool>(_isChecked); 
    Name = new Property<string>(_name); 
    } 
} 
+0

這不包含propertychanged通知,是嗎?物業甚至沒有使用。 – HoboSteaux 2013-04-04 04:57:43

1

我不太讓你的你想達到與物業設計什麼目標。通常我不會在WPF中這樣做,所以我不太確定這是否有幫助。

通常,我在ViewModel級別實現INotifyPropertyChanged,而不是在VM擁有的屬性中。例如:

public class ViewModel : INotifyPropertyChanged{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

其次,我不使用DependencyProperty,除非我做一個WPF用戶控件。所以我使用私有屬性並使用屬性名稱觸發OnPropertyChanged。

private string _name; 
public string Name{ 
    set{ 
    _name = value; 
    OnPropertyChanged("Name"); 
    } 
} 

最後,在XAML,我用UpdateSourceTrigger =的PropertyChanged結合。

<TextBlock Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

也許你可以嘗試在你的綁定添加UpdateSourceTrigger=PropertyChanged,但我不知道是否會工作。

+0

我正在試圖爲每個想要綁定的值創建它,我可以反覆重用propertychanged代碼,而無需複製/粘貼所有代碼。 UpdateSourceTrigger雖然可能是東西! – HoboSteaux 2013-04-04 05:20:50

+0

我不認爲這會有用。只需創建一個基類爲ViewModel,它實現'INotifyPropertyChanged'並調用'OnPropertyChanged(「PropertyName」);'每次設置屬性。 – Fendy 2013-04-04 05:32:49