Исключение при связывании с UpdateSourceTrigger, установленным в LostFocus
Следующий код запускается, если UpdateSourceTrigger установлен в PropertyChanged, но выдает исключение при инициализации, когда UpdateSourceTrigger установлен в LostFocus.
В чем проблема с этой реализацией и как ее можно исправить?
исключение
"'ComboBoxSample.ComboBoxBehavior' type must derive from FrameworkElement or FrameworkContentElement."
Посмотреть
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<ComboBox ItemsSource="{Binding Path=Apples}"
DisplayMemberPath="Cultivar">
<i:Interaction.Behaviors>
<local:ComboBoxBehavior
SelectedValue="{Binding Path=SelectedId,
Mode=TwoWay,
UpdateSourceTrigger=LostFocus}"/>
</i:Interaction.Behaviors>
</ComboBox>
</Grid>
Поведение
public class ComboBoxBehavior : Behavior<ComboBox>
{
public static readonly DependencyProperty SelectedValueProperty
= DependencyProperty.Register("SelectedValue",
typeof(object),
typeof(ComboBoxBehavior),
new FrameworkPropertyMetadata(null, (target, args) => { }));
public object SelectedValue
{
get { return GetValue(SelectedValueProperty); }
set { SetValue(SelectedValueProperty, value); }
}
protected override void OnAttached() { base.OnAttached(); }
protected override void OnDetaching() { base.OnDetaching(); }
}
ViewModel
public class ViewModel
{
public ObservableCollection<Apple> Apples { get; set; }
public int SelectedId { get; set; }
public ViewModel()
{
Apples = new ObservableCollection<Apple>
{
new Apple()
{
Id = 0,
Cultivar = "Alice",
Weight = 0.250
},
new Apple()
{
Id = 1,
Cultivar = "Golden",
Weight = 0.3
},
new Apple()
{
Id = 2,
Cultivar = "Granny Smith",
Weight = 0.275
}
};
}
}
public class Apple
{
public int Id { get; set; }
public string Cultivar { get; set; }
public double Weight { get; set; }
}
2 ответа
Ваша проблема в том, что вы пытаетесь использовать свой <local:ComboBoxBehavior />
как будто это был блок (элемент каркаса). В xaml вы можете писать только блоки, которые наследуются от Framework Framework (например, параграф, TextBlock и т. Д.). Поскольку я не уверен, чего вы хотите добиться, это лучший ответ, который я могу дать с вашим уровнем детализации.
Я сам новичок в этом, поэтому не уверен, насколько это поможет. Во-первых, вы пытаетесь просто обновить SelectedItem и SelectedValue вместе? Если это так, возможно, поведение не требуется (предупреждение, непроверенный код!):
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<ComboBox ItemsSource="{Binding Path=Apples}"
DisplayMemberPath="Cultivar" SelectedValue="{Binding Path=SelectedId,
Mode=TwoWay,
UpdateSourceTrigger=LostFocus}" >
</ComboBox>
</Grid>
Или что-то в этом роде, чтобы связать SelectedValue комбинированного списка непосредственно с SelectedId в модели представления. Затем, если вам нужно что-то сделать в поведении при изменении SelectedValue, создайте это как свое собственное поведение отдельно от обновления SelectedId. Это помогает вообще?