Можно ли привязать несколько объектов данных к одному и тому же окну, но к разным вкладкам в WPF? - PullRequest
0 голосов
/ 03 октября 2018

XAML

 <TabControl>
     <TabItem Header="Device" BorderBrush="#FF000209" Background="#FF000000" x:Name="Tab_STATUS">
       <Label  Style="{StaticResource LabelTitle}"   Content="Device Name" Margin="14.439,24.192,-83.497,8"  d:IsStaticText="True" Background="#00D32626" x:Name="Label_DeviceName" d:LayoutOverrides="Width, Height" />
       <Label  Style="{StaticResource LabelTitle}"   Content="{Binding DEVICE_NAME, Mode = OneWay}"  Grid.Row="0" Grid.Column="1" Margin="31.844,24.192,0,8" HorizontalAlignment="Left" x:Name="Label_DeviceName_Value" />
    </TabItem>


    <TabItem Header="User" BorderBrush="#FF000209" Background="#FF000000" x:Name="Tab_STATUS">
       <Label  Style="{StaticResource LabelTitle}"   Content="User Name" Margin="14.439,24.192,-83.497,8"  d:IsStaticText="True" Background="#00D32626" x:Name="Label_UserName" d:LayoutOverrides="Width, Height" />
       <Label  Style="{StaticResource LabelTitle}"   Content="{Binding USERR_NAME, Mode = OneWay}"  Grid.Row="0" Grid.Column="1" Margin="31.844,24.192,0,8" HorizontalAlignment="Left" x:Name="Label_UserName_Value" />
    </TabItem>


 </TabControl>

Выше TabControl имеется два TabItem с именем Device и User соответственно.
Устройство Вкладка должна быть связана с DeviceInfo и Пользователь Вкладка с UserInfo .

Ниже приведенаXAML.CS
Я не могу связать устройство и пользователя одновременно.

XAML.CS : это окно имеет несколько вкладок

public MainWindow()
    {
        InitializeComponent();
        DeviceInfo Phone= new Phone{ DEVICE_NAME = "xxx", DEVICE_ID = "123456789",};
        User_info = new User_info ("ZZZZ", "18", "5.8", "65kg");
        this.DataContext = cpu_info; 
       //Unable to bind hence commented.
       // this.DataContext = User_info ;

    }

Я новичок в концепции привязки данных, я не могу точно понять эту концепцию.Если мне нужно привязать разные данные к одному и тому же окну?Как мне это сделать? Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Возможно, вы захотите установить текст данных вашего окна равным Self и создать два свойства: UserInfo и DeviceInfo, к которым будут привязаны элементы вашей вкладки:

public partial class MainWindow
{
    public DeviceInfo DeviceInfo { get; }

    public UserInfo UserInfo { get; }

    public MainWindow()
    {
        InitializeComponent();
        DeviceInfo = new DeviceInfo();
        UserInfo = new UserInfo();
    }
}

И в вашем xaml:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        WindowStartupLocation="Manual"
        Title="MainWindow"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <TabControl>
            <TabItem Header="Device" DataContext="{Binding DeviceInfo}"/>
            <TabItem Header="User"  DataContext="{Binding UserInfo}"/>
        </TabControl>
    </Grid>
</Window>

Я удалил те части вашего кода, которые не имеют отношения к ответу на вопрос.

0 голосов
/ 03 октября 2018

Существует несколько способов достижения вашей цели:

  • Создайте определенный класс, который будет содержать свойства, которые вы хотите отобразить, то есть ViewModel (в MVVMархитектура), и пусть ваш DataContext будет экземпляром этого класса.

  • Используйте само окно как свой собственный DataContext (не MVVM).

Примечание : DataContext FrameworkElement наследуется от родительского по умолчанию.

1-е решение:

MainWindowViewModel.cs

public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        User = new User_info("ZZZZ", "18", "5.8", "65kg");
        Phone = new Phone { DEVICE_NAME = "xxx", DEVICE_ID = "123456789" };
    }

    public User_info User { get; set; }

    public DeviceInfo Phone { get; set; }

    // If you need only the device's name in the view
    public string DeviceName => Phone.DEVICE_NAME;
}

MainWindow.xaml (упрощенно)

<TabItem Header="User">
    <TextBlock Text="{Binding User.USER_NAME}"/>
</TabItem>
<TabItem Header="Device">
    <TexBlock Text="{Binding Phone.DEVICE_NAME}"/>
    <!-- OR -->
    <TexBlock Text="{Binding DeviceName}"/>
</TabItem>

MainWindow.xaml.cs

public partial class MainWindow
{
    public MainWindow()
    {
        DataContext = new MainWindowViewModel();
        InitializeComponent();
    }
}

Второе решениечтобы переместить свойства MainWindowViewModel в выделенный код и установить DataContext = this; в конструкторе.

Другие мысли:

  • Если связанные свойства не являются статическими иПри условии изменения, ваш DataContext должен уведомить представление, оно не будет автоматически обновляться.Вам необходимо реализовать INotifyPropertyChanged или унаследовать класс, который делает это за вас, например Prism.Mvvm.BindableBase.

  • При связывании с TextBlock или Label вам не нужноукажите Mode=OneWay, если только вы не измените значение из выделенного кода.

  • Вам следует использовать TextBlock, если вам не нужна функция AccessText Label.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...