Исключение при связывании с 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. Это помогает вообще?

Другие вопросы по тегам