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.v22.2.dll
NuGet Package: DevExpress.Wpf.Core
Declaration
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:
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>
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;
}
}
Related GitHub Examples
The following code snippet (auto-collected from DevExpress Examples) contains a reference to the ReadOnlyDependencyPropertyBindingBehavior class.
Note
The algorithm used to collect these code examples remains a work in progress. Accordingly, the links and snippets below may produce inaccurate results. If you encounter an issue with code examples below, please use the feedback form on this page to report the issue.