WPF自定义控件的依赖属性无意中影响其他控件

时间:2016-01-28 20:54:49

标签: c# wpf data-binding user-controls dependency-properties

我正在制作一个应该记录鼠标位置的窗口。我创建了一个用户控件,它应该显示该位置标签的当前坐标,并允许用户更改它们 enter image description here

它的效果很好,除了一个更新时它们都会改变。

认为这与依赖属性是静态注册的事实有关。它们需要是依赖属性,因为我需要能够将它们从xaml绑定到我的模型。

如何让用户控件彼此独立?

<UserControl x:Class="SapFormFiller.SerializableMouseEditorControl"
         ...
         DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="60*"/>
        ...
        <ColumnDefinition Width="20*"/>            
    </Grid.ColumnDefinitions>
    <Label Content="{Binding LabelText}"></Label>
    <Label Grid.Column="1" Content="{Binding SerializableMouseKeyboardEventArgs.X}"/>
    <Label Grid.Column="2" Content="{Binding SerializableMouseKeyboardEventArgs.Y}"/>
    <Button Grid.Column="3" Margin="0,0,0.4,0" Click="ButtonBase_OnClick">Edit</Button>
</Grid>

CS:

public partial class SerializableMouseEditorControl : UserControl
{
    public static DependencyProperty LabelTextProperty = DependencyProperty.Register(
        "LabelText", typeof (string), typeof (SerializableMouseEditorControl), new PropertyMetadata(default(string)));

    public string LabelText
    {
        get { return (string) GetValue(LabelTextProperty); }
        set { SetValue(LabelTextProperty, value); }
    }
    public static DependencyProperty SerializableMouseKeyboardEventArgsProperty = DependencyProperty.Register(
        "SerializableMouseKeyboardEventArgs", typeof (SerializableMouseKeyboardEventArgs), typeof (SerializableMouseEditorControl), new PropertyMetadata(new SerializableMouseKeyboardEventArgs()));

    public SerializableMouseKeyboardEventArgs SerializableMouseKeyboardEventArgs
    {
        get { return (SerializableMouseKeyboardEventArgs) GetValue(SerializableMouseKeyboardEventArgsProperty); }
        set { SetValue(SerializableMouseKeyboardEventArgsProperty, value); }
    }
    public SerializableMouseEditorControl()
    {
        InitializeComponent();
        SerializableMouseKeyboardEventArgs = new SerializableMouseKeyboardEventArgs();
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        SerializableMouseKeyboardEventArgs.Update();
    }
}

SerializableMouseKeyboardEventArgs:

public class SerializableMouseKeyboardEventArgs : INotifyPropertyChanged
{
    public int X
    {
        get { return _x; }
        set
        {
            _x = value; 
            OnPropertyChanged("X");
        }
    }

    public int Y
    {
        get { return _y; }
        set
        {
            _y = value;
            OnPropertyChanged("Y");

        }
    }
    ...
    IKeyboardMouseEvents gkme;        
    private int _x = 0;
    private int _y=0;

    public override string ToString(){...}
    public SerializableMouseKeyboardEventArgs()
    {
        gkme = Hook.GlobalEvents();
    }
    public void Update()
    {
        IsEditing = true;
        gkme.MouseClick += Gkme_MouseClick;
    }

    private void Gkme_MouseClick(object sender, MouseEventArgs e)
    {
        if(e.Button==MouseButtons.Left)
        {
            this.X = e.X;
            this.Y = e.Y;
        }
        else if (e.Button == MouseButtons.Right)
        {
            gkme.MouseClick -= Gkme_MouseClick;
            IsEditing = false;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

0 个答案:

没有答案