如何照顾两个DataContext

我已经合并了两个程序,现在我的代码中有两个DataContext。一个是DataContext = this;,另一个是DataContext = _uiData;。我想保留前者,因为有许多绑定都依赖于此DataContext(尽管我的代码中未显示)。对于后者,我将其更改为textBox.Text = _uiData.ToString();,但未显示任何内容。您将如何处理这种情况?

这是我的代码:

MainWindow.xaml.cs

using Both_ListBox_n_TextBox_Binding.ViewModel;
using System.Collections.ObjectModel;
using System.Windows;

namespace Both_ListBox_n_TextBox_Binding
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<GraphViewModel> RightListBoxItems { get; }
            = new ObservableCollection<GraphViewModel>();
        private UISimpleData _uiData = new UISimpleData();

        public MainWindow()
        {
            InitializeComponent();

            RightListBoxItems.Add(new GraphViewModel("T1"));
            RightListBoxItems.Add(new GraphViewModel("T2"));
            RightListBoxItems.Add(new GraphViewModel("T3"));

            DataContext = _uiData; // How can I show this?
            //textBox.Text = _uiData.ToString(); // This doesn't show anything
            DataContext = this; // I'd like to KEEP this
            //RightListBox.ItemsSource = RightListBoxItems; // Works,but not for this time
        }
    }
}

MainWindow.xaml

<Window x:Class="Both_ListBox_n_TextBox_Binding.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"
        xmlns:local="clr-namespace:Both_ListBox_n_TextBox_Binding"
        mc:Ignorable="d"
        Title="MainWindow" Height="253.5" Width="297.5">
    <Grid>
        <ListBox x:Name="RightListBox" 
    ItemsSource="{Binding RightListBoxItems}" DisplayMemberPath="Text"
    Selectionmode="Extended" Margin="20,20,100"/>
        <TextBox Margin="100,40" HorizontalAlignment="Left" VerticalAlignment="Bottom" Height="22" Width="100"
                 Text="{Binding DoubleField,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <Trigger Property="Validation.HasError" Value="true">
                            <Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent,RelativeSource={RelativeSource Self}}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </Grid>
</Window>

ViewModel / UISimpleData.cs

using System;
using System.ComponentModel;

namespace Both_ListBox_n_TextBox_Binding.ViewModel
{
    public class UISimpleData : INotifyPropertyChanged,IDataErrorInfo
    {
        private double _doubleField = 5.5;

        public double DoubleField
        {
            get
            {
                return _doubleField;
            }
            set
            {
                if (_doubleField == value)
                    return;

                _doubleField = value;
                RaisePropertyChanged("DoubleField");
            }
        }

        public string this[string propertyName]
        {
            get
            {
                string validationResult = null;
                switch (propertyName)
                {
                    case "DoubleField":
                        {
                            if (DoubleField < 0.0 || DoubleField > 10.0)
                                validationResult = "DoubleField is out of range";
                            break;
                        }
                    default:
                        throw new ApplicationException("Unknown Property being validated on UIData");
                }
                return validationResult;
            }
        }

        public string Error { get { return "Not Implemented"; } }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string property)
        {
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(property));
        }
    }
}

ViewModel / GraphViewModel.cs

namespace Both_ListBox_n_TextBox_Binding.ViewModel
{
    public class GraphViewModel
    {
        public string Text { get; }

        public GraphViewModel(string text) => Text = text;
    }
}

谢谢。

duxinaa 回答:如何照顾两个DataContext

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3072740.html

大家都在问