2013-11-19 2 views
1

У меня есть доска с ярлыками для кликов (Grass and Unit). Когда я нажимаю ярлык Grass, я должен переместить метку блока в положение x и y Grass. Это работает, но что-то не так. Когда я нажимаю на метку, ничего не происходит до тех пор, пока я не вытащу курсор из щелкнутой метки, тогда будет выполняться желаемое поведение.C# WPF Привязки не обновляются до тех пор, пока MouseOut

XAML

<local:Grass Grid.Row="9" Grid.Column="16" /> 
<local:Unit Grid.Row="{Binding Path=xPos, UpdateSourceTrigger=PropertyChanged}" Grid.Column="{Binding Path=yPos, UpdateSourceTrigger=PropertyChanged}" > 
     <local:Unit.Background> 
      <ImageBrush ImageSource="Images/tjej.png"/> 
     </local:Unit.Background> 
</local:Unit> 

ObjectInspector

public class ObjectInspector : INotifyPropertyChanged 
{ 
    private int _xPos = 1, _yPos = 2; 



    public int xPos 
    { 
     get { return _xPos; } 
     set 
     { 
      _xPos = value; 
      NotifyPropertyChanged("xPos"); 
     } 
    } 

    public int yPos 
    { 
     get { return _yPos; } 
     set { 
      _yPos = value; 
      NotifyPropertyChanged("yPos"); 
     } 
    } 

    private string _type = "none"; 

    public string type 
    { 
     get { return _type; } 
     set { 
      _type = value; 
      NotifyPropertyChanged("type"); 
     } 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      System.Diagnostics.Debug.WriteLine("property changed"); 

      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

травы

public class Grass : Button 
{ 

    protected override void OnClick() 
    { 
     base.OnClick(); 
     int x = (int)this.GetValue(Grid.RowProperty); 
     int y = (int)this.GetValue(Grid.ColumnProperty); 
     string type = this.GetType().Name; 
     MainWindow.objectInspector.xPos = x; 
     MainWindow.objectInspector.yPos = y; 
     MainWindow.objectInspector.type = type; 
    } 
} 

MainWindow

public partial class MainWindow : Window 
{ 
    public static ObjectInspector objectInspector= new ObjectInspector(); 
    public MainWindow() 
    { 
     InitializeComponent();      
     this.DataContext = objectInspector; 


    } 
} 

Любые идеи?

Редактировать Добавлено MainWindow и Grass

+0

я думаю, что это поможет если вы можете вставить код обработки клика тоже. – Naresh

+0

Как кто-нибудь может попытаться ответить на ваш вопрос, предоставленный с такой маленькой и такой неуместной информацией?Мы не знаем, что находится внутри какого-либо из ваших элементов управления, мы не знаем, что такое 'Binding', о котором вы говорите, и мы ничего не знаем о вашем обработчике кликов. Пожалуйста, чувак ... дай нам перерыв ... помоги нам помочь тебе. – Sheridan

+0

Перерыв. Показанный код! –

ответ

1

EDIT

Попробуйте зарегистрироваться на общий обработчик событий Click кнопок:

<local:Grass Grid.Row="9" Grid.Column="16" Click="ClickEventHandler" /> 
... 

И взять элемент травы от отправителя, в метод обработчика событий.


В любом случае, я думаю, что лучший способ для этого - это использование MVVM-приложения. Вы можете установить GrassViewModel и UnitViewModel. Затем создайте для каждого из них DataTemplate. Например:

<DataTemplate DataType="{x:Type ViewModel:UnitViewModel}"> 
    ...Visual Elements Here... 
</DataTemplate> 

для отображения элементов в сетке, вы можете использовать в ListBox с Grid как панели пунктов, некоторые, как это:

<ListBox ItemsSource={Binding AllItemsCollection}> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid> 
       ...rows and columns definitions here... 
      </Grid> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <!--HERE THE ITEMS STYLE, HERE YOU SET THE COLUMN, ROW BINDINGS--> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="Grid.Row" Value="{Binding yPos}"/> 
      <Setter Property="Grid.Column" Value="{Binding xPos}"/> 
      <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Затем вам нужно только создать AllItemsCollection в ваша модель просмотра со всеми необходимыми элементами. Вы можете обработчик события щелчка с помощью вариантов поведения, или создать UserControl для травы (и контролируя событие щелчка внутри):

<DataTemplate DataType="{x:Type ViewModel:UnitViewModel}"> 
    <GrassUserControl ...Inside the grass user control you can handler the click event.../> 
</DataTemplate> 

Надежда помогает ...

1

Если ваш следующий MVVM, то вы можете прикрепить свойство метки, как показано ниже. Вы можете атташе такое поведение какого-либо контроля, производный от UIElement

Создать вложенное свойство для MouseClick

public class MouseClick 
{ 
    public static readonly DependencyProperty MouseLeftClickProperty = 
     DependencyProperty.RegisterAttached("MouseLeftClick", typeof(ICommand), typeof(MouseClick), 
     new FrameworkPropertyMetadata(CallBack)); 

    public static void SetMouseLeftClick(DependencyObject sender, ICommand value) 
    { 
     sender.SetValue(MouseLeftClickProperty, value); 
    } 

    public static ICommand GetMouseLeftClick(DependencyObject sender) 
    { 
     return sender.GetValue(MouseLeftClickProperty) as ICommand; 
    } 

    public static readonly DependencyProperty MouseEventParameterProperty = 
     DependencyProperty.RegisterAttached(
      "MouseEventParameter", 
      typeof(object), 
      typeof(MouseClick), 
      new FrameworkPropertyMetadata((object)null, null)); 


    public static object GetMouseEventParameter(DependencyObject d) 
    { 
     return d.GetValue(MouseEventParameterProperty); 
    } 


    public static void SetMouseEventParameter(DependencyObject d, object value) 
    { 
     d.SetValue(MouseEventParameterProperty, value); 
    } 

    private static void CallBack(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (sender != null) 
     { 
      UIElement element = sender as UIElement; 
      if (element != null) 
      { 
       if (e.OldValue != null) 
       { 
        element.RemoveHandler(UIElement.MouseDownEvent, new MouseButtonEventHandler(Handler)); 
       } 
       if (e.NewValue != null) 
       { 
        element.AddHandler(UIElement.MouseDownEvent, new MouseButtonEventHandler(Handler), true); 
       } 
      } 
     } 
    } 
    private static void Handler(object sender, EventArgs e) 
    { 
     UIElement element = sender as UIElement; 
     if (sender != null) 
     { 
      ICommand cmd = element.GetValue(MouseLeftClickProperty) as ICommand; 
      if (cmd != null) 
      { 
       RoutedCommand routedCmd =cmd as RoutedCommand; 
       object paramenter = element.GetValue(MouseEventParameterProperty); 
       if (paramenter == null) 
       { 
        paramenter = element; 
       } 
       if (routedCmd != null) 
       { 
        if (routedCmd.CanExecute(paramenter, element)) 
        { 
         routedCmd.Execute(paramenter, element); 
        } 
       } 
       else 
       { 
        if (cmd.CanExecute(paramenter)) 
        { 
         cmd.Execute(paramenter); 
        } 
       } 
      } 
     } 
    } 
} 

В вы XAML атташе команды вашего ViewModel, как показано ниже

<Label Height="30" Width="200" Margin="10" Content="Click" local:MouseClick.MouseLeftClick="{Binding Click}" /> 
Смежные вопросы