How to set a binding in Code?

后端 未结 3 1100
深忆病人
深忆病人 2020-11-28 04:20

I have the need to set a binding in code.

I can\'t seem to get it right tho.

This is what i have tried:

XAML:



        
相关标签:
3条回答
  • 2020-11-28 04:57

    In addition to the answer of Dyppl, I think it would be nice to place this inside the OnDataContextChanged event:

    private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        // Unforunately we cannot bind from the viewmodel to the code behind so easily, the dependency property is not available in XAML. (for some reason).
        // To work around this, we create the binding once we get the viewmodel through the datacontext.
        var newViewModel = e.NewValue as MyViewModel;
    
        var executablePathBinding = new Binding
        {
            Source = newViewModel,
            Path = new PropertyPath(nameof(newViewModel.ExecutablePath))
        };
    
        BindingOperations.SetBinding(LayoutRoot, ExecutablePathProperty, executablePathBinding);
    }
    

    We have also had cases were we just saved the DataContext to a local property and used that to access viewmodel properties. The choice is of course yours, I like this approach because it is more consistent with the rest. You can also add some validation, like null checks. If you actually change your DataContext around, I think it would be nice to also call:

    BindingOperations.ClearBinding(myText, TextBlock.TextProperty);
    

    to clear the binding of the old viewmodel (e.oldValue in the event handler).

    0 讨论(0)
  • 2020-11-28 05:10

    Replace:

    myBinding.Source = ViewModel.SomeString;
    

    with:

    myBinding.Source = ViewModel;
    

    Example:

    Binding myBinding = new Binding();
    myBinding.Source = ViewModel;
    myBinding.Path = new PropertyPath("SomeString");
    myBinding.Mode = BindingMode.TwoWay;
    myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    BindingOperations.SetBinding(txtText, TextBox.TextProperty, myBinding);
    

    Your source should be just ViewModel, the .SomeString part is evaluated from the Path (the Path can be set by the constructor or by the Path property).

    0 讨论(0)
  • 2020-11-28 05:17

    You need to change source to viewmodel object:

    myBinding.Source = viewModelObject;
    
    0 讨论(0)
提交回复
热议问题