سؤال

لديّ USERCONTROL الذي أحتاجه لتعيين DATACONTEXT محدد. يستخدم UserControl multivalueConverters. ومع ذلك ، فإن الربط في multivalueConverter فشل في استخدام datacontext. إنه يعمل بشكل جيد لمحولات القيمة العادية. هل يعرف أحد مايجري؟ للتوضيح ، لا يشبه الرمز أدناه رمزتي الحقيقية ، إنه مجرد عينة تتكاثر مشكلتي. على سبيل المثال ، يأخذ multivalueConverters أكثر من حجة واحدة.

XAML:

<Window x:Class="MultConvTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MultConvTest="clr-namespace:MultConvTest"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>
        <MultConvTest:MyValueConverter x:Key="MyValueConverter" />
        <MultConvTest:MyMultiConverter x:Key="MyMultiConverter" />
    </Window.Resources>

    <StackPanel>

        <!--This works, output is Formatted: 7-->
        <TextBlock 
            DataContext="{Binding Path=Data}"
            Text="{Binding Path=Length, Converter={StaticResource MyValueConverter}}" />

        <!--This works, output is Formatted: 7-->
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource MyMultiConverter}">
                    <Binding Path="Data.Length" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>

        <!--This fails, the converter never access the DataContext of the textbox-->
        <TextBlock 
            DataContext="{Binding Path=Data}">
            <TextBlock.Text>
                <MultiBinding Converter="{StaticResource MyMultiConverter}">
                    <Binding Path="Length" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>

    </StackPanel>

</Window>

الكود وراء:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace MultConvTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            DataContext = this;
        }

        public string Data
        {
            get { return "My Text"; }
        }
    }

    public class MyValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            int number = (int)value;
            return string.Format("Formatted: {0}", number);
        }

        public object ConvertBack(object value, Type targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class MyMultiConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // This will fail when DataContext is set. values[0] is of type Ms.Internal.NamedObject 
            // with value DependencyProperty.UnsetValue.
            int number = (int)values[0];
            return string.Format("Formatted: {0}", number);
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
هل كانت مفيدة؟

المحلول

أنت لن تحب هذا ؛-)

ببساطة ضع الخط DataContext=this قبل InitializeComponent()

يبدو أن multiconverter لمربع النص الثالث يتم تشغيله قبل تعيين datacontext العالمي ، وبالتالي في الواقع ينتج خطأ مرجعي فارغ ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top