0

我有一个 xaml 代码,如下所示: 在 MouseLeftButtonDown 上,我将其重定向到颜色 GenerateGlowEffect 必须更改的 viewModel。这没有反映。对于 this.PropertyChanged XAML,它始终返回 null:

<UserControl
         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:ed="http://schemas.microsoft.com/expression/2010/drawing"

xmlns:telerikDocking="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Docking"
xmlns:Telerik_Windows_Controls="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls"
xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="TabItemContents.MapDetail"

mc:Ignorable="d"  Width="Auto" Height="430.333">


<Grid x:Name="LayoutRoot" Background="{StaticResource TabControlActiveAreaColor}" Height="430.333" VerticalAlignment="Top" HorizontalAlignment="Left">        
<Grid.RowDefinitions>
<RowDefinition Height="192.833"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
    <Rectangle IsHitTestVisible="True"    x:Name="Rectangle_Generate"  Margin="25.334,70.167,0,65.333"  Cursor="{DynamicResource HandCursor}"  RadiusX="10" RadiusY="10" HorizontalAlignment="Left" Width="88.5" StrokeThickness="1.5" d:LayoutOverrides="HorizontalAlignment" MouseLeftButtonDown="Rectangle_Generate_MouseLeftButtonDown" >        
            <Rectangle.Fill>
                <SolidColorBrush Color="{DynamicResource RectangleColor}"/>
            </Rectangle.Fill>
            <Rectangle.Effect >
                <DropShadowEffect RenderingBias="Quality" BlurRadius="{DynamicResource BlurRadius}" ShadowDepth="0"  Color="{Binding GenerateGlowEffect}"   />      
            </Rectangle.Effect>
        </Rectangle>


</Grid>

代码隐藏:

public partial class MapDetail : UserControl
{
    ViewModel ViewModelObject;
    public MapDetail()
    {
        InitializeComponent();
        ViewModelObject= new ViewModelObject((IUnityContainer)Application.Current.Properties["UnityContainer"]);
    }

    private void Rectangle_Generate_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        ViewModelObject.SetColor();
    }

}

视图模型:

public class ViewModel : ViewModelBase
{

    private IUnityContainer _unityContainer;
    private ILogger _logger;
    private Model model;
private string _generateGlowEffect; 




    public ViewModel(IUnityContainer unityContainer)
    {

        _unityContainer = unityContainer;

        try
        {
    model = new Model(unityContainer);

        }
        catch (Exception ex)
        {
            throw ex;
        }

    }
public void SetColor()
{
GenerateGlowEffect = "White";
}
public string GenerateGlowEffect
{
get { return _generateGlowEffect; }
set {
_generateGlowEffect = value;
OnPropertyChanged("GenerateGlowEffect");
}
}

}
}
public string GenerateGlowEffect
    {
        get { return _generateGlowEffect; }
        set {
            _generateGlowEffect = value;
            OnPropertyChanged("GenerateGlowEffect");
        }
    }

视图模型库:

public class ViewModelBase : INotifyPropertyChanged, IDisposable
{
    #region Constructor

    protected ViewModelBase()
    {
    }

    #endregion // Constructor

    #region DisplayName

    /// <summary>
    /// Returns the user-friendly name of this object.
    /// Child classes can set this property to a new value,
    /// or override it to determine the value on-demand.
    /// </summary>
    public virtual string DisplayName { get; protected set; }

    #endregion // DisplayName

    #region Debugging Aides

    /// <summary>
    /// Warns the developer if this object does not have
    /// a public property with the specified name. This 
    /// method does not exist in a Release build.
    /// </summary>
    [Conditional("DEBUG")]
    [DebuggerStepThrough]
    public void VerifyPropertyName(string propertyName)
    {
        // Verify that the property name matches a real,  
        // public, instance property on this object.
        if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        {
            string msg = "Invalid property name: " + propertyName;

            if (this.ThrowOnInvalidPropertyName)
                throw new Exception(msg);
            else
                Debug.Fail(msg);
        }
    }

    /// <summary>
    /// Returns whether an exception is thrown, or if a Debug.Fail() is used
    /// when an invalid property name is passed to the VerifyPropertyName method.
    /// The default value is false, but subclasses used by unit tests might 
    /// override this property's getter to return true.
    /// </summary>
    protected virtual bool ThrowOnInvalidPropertyName { get; private set; }

    #endregion // Debugging Aides

    #region INotifyPropertyChanged Members

    /// <summary>
    /// Raised when a property on this object has a new value.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raises this object's PropertyChanged event.
    /// </summary>
    /// <param name="propertyName">The property that has a new value.</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        this.VerifyPropertyName(propertyName);

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    #endregion // INotifyPropertyChanged Members

    #region IDisposable Members

    /// <summary>
    /// Invoked when this object is being removed from the application
    /// and will be subject to garbage collection.
    /// </summary>
    public void Dispose()
    {
        this.OnDispose();
    }

    /// <summary>
    /// Child classes can override this method to perform 
    /// clean-up logic, such as removing event handlers.
    /// </summary>
    protected virtual void OnDispose()
    {
    }


    #endregion // IDisposable Members

}

}

4

1 回答 1

0

如果this.PropertyChangednull,则表示您的 XAML 未绑定到该属性。您需要设置,DataContext否则 WPF 引擎不知道要绑定什么。

public MapDetail()
{
    InitializeComponent();
    this.ViewModelObject= new VViewModelObject((IUnityContainer)Application.Current.Properties["UnityContainer"]);
    this.DataContext = this.ViewModelObject;
}
于 2012-11-14T07:50:15.683 回答