Итак, я пытаюсь создать UserControl с некоторыми DependencyProperties, чтобы я мог повторно использовать код. Однако некоторые свойства не обновляются, а другие обновляются. Что еще более странно, так это то, что даже для тех свойств, которые обновляются, метод set вообще не вызывается.
Вот мой код:
На ViewModel:
public ICommand TestCommand = new DelegateCommand(x => MessageBox.Show("Ocorreu Evento"));
public List<string> TestList = new List<string> { "Hello","This","is","a","Test" };
В представлении:
<views:CustomizedList Header="Testing"
Items="{Binding TestList}"/>
Представление пользовательского элемента управления:
<StackPanel>
<Label Content="{Binding Header}" />
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="Hello"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
Код управления пользователем:
public string Header
{
get { return (string)GetValue(HeaderProperty); }
set
{
MessageBox.Show("New header is " + value);
SetValue(HeaderProperty, value);
}
}
public BindingList<object> Items
{
get { return (BindingList<object>)GetValue(ItemsProperty); }
set {
SetValue(ItemsProperty, value);
Console.WriteLine("Value was set with " + value.Count + " items.");
}
}
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(string),
typeof(ListaCustomizada));
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(BindingList<object>),
typeof(ListaCustomizada));
Заголовок отображается, а элементов нет. Не то, чтобы я добавил некоторые отпечатки консоли, чтобы проверить, вызываются ли методы, но ничего не отображается, даже для заголовка. Я устанавливаю DataContext UserControl как самого себя.
Любые идеи?
ИЗМЕНИТЬ:
Следуя предложению @Garry Vass, я добавил функцию обратного вызова. Новый код:
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(string),
typeof(ListaCustomizada), new PropertyMetadata("", ChangedCallback));
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(BindingList<object>),
typeof(ListaCustomizada), new PropertyMetadata(new BindingList<object>(), ChangedCallback));
private static void ChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine("Dependency property is now " + e.NewValue);
}
При этом я вижу изменение значения заголовка, но для элементов не происходит обратного вызова.
ИЗМЕНИТЬ:
Изменен TestList как свойство вместо поля, его тип BindingList для согласования с данными в пользовательском элементе управления, все те же результаты.
public BindingList<object> TestList { get; set; }
public ViewModel()
{
TestList = new BindingList<object> { "Hello", "This", "is", "a", "Test" };
}
РЕДАКТИРОВАТЬ: Тестируя больше, я обнаружил, что ошибка возникает из-за того, что DP ont eh usercontrol привязан к DP в представлении, которое привязано к виртуальной машине.
EDIT: Наконец-то заработало. Поискав немного глубже, я нашел эту ссылку < /a> в codeproject, который прекрасно объясняет, как создавать пользовательские элементы управления.
DependencyProperties
в WPF — это особый вид свойств. При этом вашиConsole.WriteLine()
иMessageBox.Show()
, скорее всего, являются причиной.DependencyProperties
не должно иметь ничего лишнего, кроме своих оригинальных геттеров и сеттеров. - person PoweredByOrange   schedule 02.08.2013