如何将一个用户控件的视图模型中的属性绑定到另一个用户控件中的属性

拉胡尔

我目前正在使用MVVM在WPF用户控件中工作。我的MainWindow.xaml如下所示。

MainWindow.xaml

<Window.Resources>
    <ObjectDataProvider x:Key="TabsList" ObjectType="{x:Type local:MainWindowModel}" MethodName="GetTabs"/>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <ListBox Grid.Column="0"  ItemsSource="{Binding Source={StaticResource TabsList}}" IsSynchronizedWithCurrentItem="True">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=TabName}" Margin="10"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <ContentControl Grid.Column="1" Content="{Binding Source={StaticResource TabsList}, Path=MyUserControl}"/>
</Grid>

数据提供者类如下

public class MainWindowModel
{
    public List<TabInfo> GetTabs()
    {
        return new List<TabInfo>()
        {
            new TabInfo() { TabName="Tab1", MyUserControl = new UserControl1()},
            new TabInfo() { TabName="Tab2", MyUserControl = new UserControl2()}
        };
    }
}
 public class TabInfo
{
    public string TabName { get; set; }
    public UserControl MyUserControl { get; set; }
}

现在,我有两个用户控件UserControl1和UserControl2每个都有一个文本框控件。每当更新UserControl2中Textbox控件的Text属性时,我都希望更新UserControl1中textbox控件的Text属性。为此,我尝试如下。

UserControl1

<UserControl x:Class="MoreOnBinding2.UserControl1"
         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" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBox Width="200" Height="20" Text="{Binding Path=UserControl1Text}"/>
</Grid>

UserControl1ViewModel

public class UserControl1VM : ViewModelBase
{
    public UserControl1VM()
    {
        this.UserControl1Text = "10";
    }
    private string userControl1Text;

    public string UserControl1Text
    {
        get { return userControl1Text; }
        set
        {
            if (userControl1Text != value)
            {
                userControl1Text = value;
                RaisePropertyChanged(() => UserControl1Text);
            }
        }
    }

}

UserControl2

<UserControl x:Class="MoreOnBinding2.UserControl2"
         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:MoreOnBinding2"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <TextBox Width="200" Height="20" 
        Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:UserControl1}}, 
        UpdateSourceTrigger=PropertyChanged, Path=UserControl1Text}" />
</Grid>

但这是行不通的。似乎UserControl2的RelativeSource标记中存在问题。有人可以帮忙吗?

大卫·莫里纽克斯(David Molyneux)

您可以在用户控件上使用Dependency属性,这将为您提供可绑定的属性。链接

编辑1

只是再看看您的班级设置。如果您遵循MVVM方法,那么我认为您不应在视图模型中引用用户控件

视图模型应该更像

public Class
{
   ObservableCollection<TabInfo> _Tabs = new ObservableCollection<TabInfo>();
   public ObservableCollection<TabInfo> Tabs
   {
     get{return _Tabs;}
     set {_Tabs = value;}//Need to implement INotifyPropertyChanged [Link][2]
   }

   public TabInfo SelectedTab {get;set;}
}

public class TabInfo
{
    public string TabName { get; set; }
    public UserControlViewModel MyUserControlViewModel{ get; set; }
} 

然后在您看来

<Window.DataContext>
    <vm:MainWindowModel />
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <ListBox Grid.Column="0"  ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True" SelectedValue="{Binding SelectedTab}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=TabName}" Margin="10"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <ContentControl Grid.Column="1" Content="{Binding SelectedTab.MyUserControlViewModel"/>
</Grid>

这应该为您提供一个选项卡列表,然后在选择一个选项卡时,会将ContentControl的内容设置为MyUserControlViewModel。

然后,您将需要使用某种模板选择器来控制ContentTemplate,以将不同的UserControl加载到ContentControl中

我尚未测试过代码的工作原理,因此您需要在所有公共属性上实现INotifyPropertyChanged,以便在属性值更改时绑定也会更新。

希望那些对你有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将控件的属性绑定到另一个控件的属性

来自分类Dev

如何将控件的属性绑定到另一个控件的属性

来自分类Dev

如何将一个属性绑定到另一个类的属性(没有UI控件)?

来自分类Dev

如何将一个属性绑定到另一个类的属性(没有UI控件)?

来自分类Dev

在Wpf GridView中,如何将控件绑定到一个项目中的另一个控件

来自分类Dev

如何绑定到WPF中的另一个控件属性

来自分类Dev

绑定到另一个用户控件

来自分类Dev

如何使用OData模型将两个数据属性直接绑定到一个控件属性中?

来自分类Dev

将属性绑定到自定义控件的另一个属性

来自分类Dev

如何将数据绑定从一个控件复制到另一个控件?

来自分类Dev

将一个用户控件中的列表视图中的项目拖动到另一个用户控件中的画布

来自分类Dev

如何从Windows Phone 8.1中的用户控件导航到另一个页面

来自分类Dev

将具有依赖项属性的值从一个类绑定到wpf中的另一个类文本框控件

来自分类Dev

我如何使用mvvm将数据从用户控件传递到另一个用户控件

来自分类Dev

如何通过使用触发器将另一个控件绑定到Setter Value属性上?

来自分类Dev

JavaFX-如何将Task progress属性绑定到call()方法中的另一个属性

来自分类Dev

单击时如何将用户控件置于另一个控件的前面

来自分类Dev

在切换到另一个控件之前,如何将数据保存在用户控件上?

来自分类Dev

如何将用户名从用户模型关联到Django中的另一个模型?

来自分类Dev

如何在另一个项目中引用的用户控件中单击呼叫按钮?

来自分类Dev

如何重用解决方案中另一个项目的Web用户控件?

来自分类Dev

将数据发送到另一个用户控件内的用户控件

来自分类Dev

如何将bean属性从一个视图传递到另一个视图

来自分类Dev

如何将bean属性从一个视图传递到另一个视图

来自分类Dev

是否可以在另一个用户控件上看到一个用户控件?

来自分类Dev

创建一个使用另一个用户控件的用户控件

来自分类Dev

如何将一个bean的属性复制到另一个类中的另一个bean?

来自分类Dev

按钮单击事件未在用户控件中触发,而是在另一个用户控件中动态创建

来自分类Dev

将一个控件放在另一个控件中

Related 相关文章

  1. 1

    如何将控件的属性绑定到另一个控件的属性

  2. 2

    如何将控件的属性绑定到另一个控件的属性

  3. 3

    如何将一个属性绑定到另一个类的属性(没有UI控件)?

  4. 4

    如何将一个属性绑定到另一个类的属性(没有UI控件)?

  5. 5

    在Wpf GridView中,如何将控件绑定到一个项目中的另一个控件

  6. 6

    如何绑定到WPF中的另一个控件属性

  7. 7

    绑定到另一个用户控件

  8. 8

    如何使用OData模型将两个数据属性直接绑定到一个控件属性中?

  9. 9

    将属性绑定到自定义控件的另一个属性

  10. 10

    如何将数据绑定从一个控件复制到另一个控件?

  11. 11

    将一个用户控件中的列表视图中的项目拖动到另一个用户控件中的画布

  12. 12

    如何从Windows Phone 8.1中的用户控件导航到另一个页面

  13. 13

    将具有依赖项属性的值从一个类绑定到wpf中的另一个类文本框控件

  14. 14

    我如何使用mvvm将数据从用户控件传递到另一个用户控件

  15. 15

    如何通过使用触发器将另一个控件绑定到Setter Value属性上?

  16. 16

    JavaFX-如何将Task progress属性绑定到call()方法中的另一个属性

  17. 17

    单击时如何将用户控件置于另一个控件的前面

  18. 18

    在切换到另一个控件之前,如何将数据保存在用户控件上?

  19. 19

    如何将用户名从用户模型关联到Django中的另一个模型?

  20. 20

    如何在另一个项目中引用的用户控件中单击呼叫按钮?

  21. 21

    如何重用解决方案中另一个项目的Web用户控件?

  22. 22

    将数据发送到另一个用户控件内的用户控件

  23. 23

    如何将bean属性从一个视图传递到另一个视图

  24. 24

    如何将bean属性从一个视图传递到另一个视图

  25. 25

    是否可以在另一个用户控件上看到一个用户控件?

  26. 26

    创建一个使用另一个用户控件的用户控件

  27. 27

    如何将一个bean的属性复制到另一个类中的另一个bean?

  28. 28

    按钮单击事件未在用户控件中触发,而是在另一个用户控件中动态创建

  29. 29

    将一个控件放在另一个控件中

热门标签

归档