Skip to main content
All docs
V25.1
  • ReadOnlyDependencyPropertyBindingBehavior Class

    Allows you to bind read-only dependency and attached properties to a ViewModel’s properties.

    Namespace: DevExpress.Mvvm.UI

    Assembly: DevExpress.Xpf.Core.v25.1.dll

    NuGet Package: DevExpress.Wpf.Core

    Declaration

    public class ReadOnlyDependencyPropertyBindingBehavior :
        Behavior<DependencyObject>

    Remarks

    Specify the following properties to use ReadOnlyDependencyPropertyBindingBehavior:

    Binding
    Gets or sets a binding that should be applied to the specified property. This is a dependency property.
    Property
    Gets or sets the bound property’s name. This is a dependency property.
    DependencyProperty
    Gets or sets the bound property. This is a dependency property.

    Customization properties:

    Command
    Gets or sets the command that the ReadOnlyDependencyPropertyBindingBehavior should execute when the bound property’s value is changed (specified in the Property or DependencyProperty). This is a dependency property.
    IsEnabled
    Gets or sets whether a bound ViewModel’s property should be updated. This is a dependency property.

    Follow the steps below to bind a read-only dependency property to a ViewModel’s property:

    1. Attach the behavior to a target control and choose one of the following options:

      • Set the Property to a target property’s name:

            <TreeView>
                <dxmvvm:Interaction.Behaviors>
                        <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="SelectedItem" />
                </dxmvvm:Interaction.Behaviors>
            </TreeView>
        
      • Use the DependencyProperty to specify a target dependency/attached property:

         <TreeView>
            <dxmvvm:Interaction.Behaviors>
                <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
            </dxmvvm:Interaction.Behaviors>
         </TreeView>
        
    2. Use the behavior’s Binding property to specify a binding to the target ViewModel’s property.

      <TreeView>
          <dxmvvm:Interaction.Behaviors>
              <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}"
                                                                DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
          </dxmvvm:Interaction.Behaviors>
      </TreeView>
      

    The following code sample binds the TreeView.SelectedItem read-only property to the ViewModel’s SelectedMenuItem property:

    <UserControl x:Class="DXSample.Views.MainView"
    <!-- ... -->
                 xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
                 <!-- ... -->
                 xmlns:ViewModels="clr-namespace:DXSample.ViewModels"
                 <!-- ... -->
        <UserControl.DataContext>
            <ViewModels:MainViewModel />
        </UserControl.DataContext>
    
        <DockPanel>
            <TreeView Name="view" ItemsSource="{Binding Menu}">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="{x:Type ViewModels:MenuItemViewModel}" ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Title}" />
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
                <dxmvvm:Interaction.Behaviors>
                    <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Binding="{Binding SelectedMenuItem, Mode=OneWayToSource}"
                                                                      DependencyProperty="{x:Static TreeView.SelectedItemProperty}" />
                </dxmvvm:Interaction.Behaviors>
            </TreeView>
        </DockPanel>
    
    </UserControl>
    
    using System.Collections.ObjectModel;
    using System.Windows;
    using DevExpress.Mvvm;
    using DevExpress.Mvvm.DataAnnotations;
    // ...
        public class MainViewModel : ViewModelBase {
            public MenuItemViewModel SelectedMenuItem {
                get { return GetProperty(() => SelectedMenuItem); }
                set { SetProperty(() => SelectedMenuItem, value); }
            }
    
            [Command]
            public void Open() {
            // ...
            }
            // ...
        }
    

    How to: Pass Validation Data from the GridControl to a ViewModel

    To pass validation data from the GridControl to a view model, use the ReadOnlyDependencyPropertyBindingBehavior to bind the view’s HasErrors property to a view model property. Set the view’s ErrorsWatchMode property to Cells.

    <dx:ThemedWindow x:Class="DXSample.MainWindow"
                     Title="{DXBinding '`GridControl has errors: ` + HasErrors'}">
    
        <dx:ThemedWindow.DataContext>
            <local:MainViewModel />
        </dx:ThemedWindow.DataContext>
    
        <DockPanel>
            <dxg:GridControl AutoGenerateColumns="AddNew"
                             ItemsSource="{Binding TaskList}">
                <dxg:GridControl.View>
                    <dxg:TableView ErrorsWatchMode="Cells"
                                   InvalidRowExceptionCommand="{Binding InvalidRowCommand}"
                                   ValidateRowCommand="{Binding ValidateRowCommand}">
                        <dxmvvm:Interaction.Behaviors>
                            <dxmvvm:ReadOnlyDependencyPropertyBindingBehavior Property="HasErrors"
                                                                              Binding="{Binding HasErrors, UpdateSourceTrigger=PropertyChanged}" />
                        </dxmvvm:Interaction.Behaviors>
                    </dxg:TableView>
                </dxg:GridControl.View>
            </dxg:GridControl>
        </DockPanel>
    
    </dx:ThemedWindow>
    
    public class MainViewModel : ViewModelBase {
        public bool HasErrors {
            get { return GetValue<bool>(); }
            set { SetValue(value); }
        }
        public ObservableCollection<Task> TaskList { get; }
        public MainViewModel() {
            TaskList = new ObservableCollection<Task> {
                new Task() {
                    TaskName = "Complete Project A",
                    StartDate = new DateTime(2009, 7, 17),
                    EndDate = new DateTime(2009, 7, 10)
                },
                new Task() {
                    TaskName = "Test Website",
                    StartDate = new DateTime(2009, 7, 10),
                    EndDate = new DateTime(2009, 7, 12)
                },
                new Task() {
                    TaskName = string.Empty,
                    StartDate = new DateTime(2009, 7, 4),
                    EndDate = new DateTime(2009, 7, 6)
                }
            };
        }
    
        [Command]
        public void ValidateRow(RowValidationArgs args) {
            args.Result = GetValidationErrorInfo((Task)args.Item);
        }
        static ValidationErrorInfo GetValidationErrorInfo(Task task) {
            if (task.StartDate > task.EndDate)
                return new ValidationErrorInfo("Start Date must be less than End Date");
            if (string.IsNullOrEmpty(task.TaskName))
                return new ValidationErrorInfo("Enter a task name");
            return null;
        }
    
        [Command]
        public void InvalidRow(InvalidRowExceptionArgs args) {
            args.ExceptionMode = ExceptionMode.NoAction;
        }
    }
    

    Inheritance

    Object
    DispatcherObject
    DependencyObject
    Freezable
    Animatable
    DevExpress.Mvvm.UI.Interactivity.AttachableObjectBase
    DevExpress.Mvvm.UI.Interactivity.Behavior
    DevExpress.Mvvm.UI.Interactivity.Behavior<DependencyObject>
    ReadOnlyDependencyPropertyBindingBehavior
    See Also