Can I bind a WPF control to a field's property

2019-01-20 10:02发布

Because I needed to split some functionality between classes, I've arrived at the following situation

xaml code

<CheckBox IsChecked="{Binding MyObjectField.MyBoolean}"  />

view model

...
public MyInternalObject MyObjectField;
...

MyObject class

public class MyInternalObject {
    ...
    public bool MyBoolean { get; set; }
    ...
}

It does not work unless I replicate the MyBoolean property in the View Model class.

public bool MyBoolean 
{ 
    get { return MyInternalObject.MyBoolean; }
    set { MyInternalObject.MyBoolean=value; }
}

Does anyone have an idea?

3条回答
甜甜的少女心
2楼-- · 2019-01-20 10:21

You can't yet (in WPF Version 4.5 you can bind to a static property). But you can create your property in App.xaml.cs

public partial class App : Application
{
    public bool MyBoolean { get; set; }
}

and bind from everywhere.

<CheckBox IsChecked="{Binding MyBoolean, Source={x:Static Application.Current}}">
查看更多
姐就是有狂的资本
3楼-- · 2019-01-20 10:30

Instead of binding an element to a field's property I changed the DataContext of the element to the required field.

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MainWindowView mainWindowView = new MainWindowView();
        var mainWindowViewModel = new MainWindowViewModel();
        mainWindowView.DataContext = mainWindowViewModel;
        mainWindowView.pagerView.DataContext = mainWindowViewModel.pager;
        mainWindowView.Show();
    }

In this example I have a DataGrid and Pager (first, prev, next, last page) below it. The elements of the MainWindowView (including the DataGrid) are binded to properties in the MainWindowViewModel but the pager buttons are binded to the properties of mainWindowViewModel.pager.

MainWindowView:

    <DataGrid Name="dgSimple" ItemsSource="{Binding DisplayedUsers}" MaxWidth="200" Grid.Row="0" SelectedItem="{Binding SelectedRow}"></DataGrid>
    <view:PagerView x:Name="pagerView" Grid.Row="2"/>

PagerView:

<UserControl x:Class="wpf_scroll.View.PagerView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:wpf_scroll.View"
         mc:Ignorable="d" 
         d:DesignHeight="30" d:DesignWidth="350">
<StackPanel Orientation="Horizontal" Grid.Row="1">
    <Label Content="Page size:"/>
    <TextBox Text="{Binding PageSize}" Width="30" VerticalContentAlignment="Center"
                 HorizontalContentAlignment="Center"></TextBox>
    <Button Content="First" Command="{Binding FirstPageCommand}"></Button>
查看更多
ゆ 、 Hurt°
4楼-- · 2019-01-20 10:38

No you cant . Because binding system uses Reflection to find the

Property in DataContext(i.e your VM)

It does not look for fields . I hope this will help.

查看更多
登录 后发表回答