Программлю на WPF, Студия 2010, .NET 3.5
Написал такую конструкцию, работает все окей, но при очередном заходе в Студии стало выдавать радостное:
A 'Binding' cannot be used within a 'TreeView' collection. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
Причем работать — не перестало. Как побороть, а то с такой ошибкой графический редактор Студии не дает с ним работать(
Подчеркиваю — весь код валиден, после компиляции — все работает как надо.
<TreeView Name="Tree" ItemsSource="{Binding Items}"
DataContext="{Binding Source={StaticResource ViewModel}}"
behaviors:MouseOverBehavior.Command="{Binding MousedOver}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate
ItemsSource="{Binding Path=Items}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace MouseClickBehavior
{
public class MouseOverBehavior : CommandBehaviorBase<Control>
{
private MouseOverBehavior(Control element)
: base(element)
{
element.MouseDoubleClick += MouseEnter;
}
void MouseEnter(object sender, MouseEventArgs e)
{
ExecuteCommand();
}
public static void SetCommand(DependencyObject obj, ICommand value)
{
obj.SetValue(CommandProperty, value);
}
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
private static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(MouseOverBehavior), new PropertyMetadata(OnSetCommandCallback));
private static void OnSetCommandCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var element = dependencyObject as Control;
if (element != null)
{
new MouseOverBehavior(element) {Command = e.NewValue as ICommand};
}
}
}
}
using System.ComponentModel;
using System.Windows;
namespace MouseClickBehavior
{
public class ModuleAViewModel : INotifyPropertyChanged
{
public ModuleAViewModel()
{
MousedOver = new DelegateCommand<object>(ItemMousedOver);
}
//Commands
public DelegateCommand<object> MousedOver { get; private set; }
private static void ItemMousedOver(object o)
{
MessageBox.Show("123");
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
Здравствуйте, Sergey_BG, Вы писали:
S_B>Здравствуйте, Namelles.One, Вы писали:
S_B>У меня несколько раз было, что все компилировалось, запускалось, а ошибка в XAML была. Объект не был DependencyObject, а это требовалось. Закрыть xaml, rebuild, опять открыть, обычно помогало найти ошибку.
S_B>В твоем примере, не совсем понятно, что такое ViewModel и далее...
S_B>Я обычно удаляю из XAML код частями и смотрю все ли нормально. Если после удаления какой-то его части ошибки исчезли, то аккуратно добавляю обратно.
А между тем проблема решена:
в
private static readonly DependencyProperty CommandProperty
заменил private на public и все заработало как надо. Забавно.
Здравствуйте, Namelles.One, Вы писали:
NO>заменил private на public и все заработало как надо. Забавно.
Угу, сообщения об ошибках не отличаются
умом и сообразительностью наглядностью.
За необходимость использования debug output для отлавливания ошибок с биндингом разработчиков надо немножко расстрелять