Привязка к загруженному XAML во время выполнения - PullRequest
0 голосов
/ 15 августа 2011

У меня была идея, которая вкратце объяснила, что я хотел бы загрузить xaml-файлы времени выполнения, а затем связать их с данными времени выполнения. Внутри этих xaml-файлов я бы использовал компонент под названием «PropertySetter», например:

public class PropertySetter : UserControl
{
    public string Value { get; set; }
    public string Text { get; set; }
    public string Adress { get; set; }

    public PropertySetter()
    {
    }
}

И xamlfile будет выглядеть так:

<Grid
    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:vf="clr-namespace:VisualFactory.vfGraphics.Graphics;assembly=VisualFactory">
    <vf:PropertySetter Name="Datapoint" Text="propset" Value="false" Adress="10201"  />
    <CheckBox IsChecked="{Binding ElementName=Datapoint, Path=Value}" Content="{Binding ElementName=Datapoint, Path=Text}" />
</Grid>

Надеюсь, вы уже поняли смысл. Флажок будет связывать его значения (контент, проверяется) с набором свойств, и при запуске приложения он просто изменяет значения группы «PropertySetter», а графика обновляет их содержимое и значения. НО: хотя xaml правильно устанавливает значения при загрузке, он не обновляет их, когда я изменяю значения параметров свойств. Я попытался установить Mode = TwoWay, и наборы свойств находятся в коллекции iNotify. Кто-нибудь пробовал что-то подобное раньше?

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Ответ лежит в классе «DependencyProperty». Я изменил PropertySetter на это:

 public class PropertySetter : UserControl
    {
        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(string), typeof(PropertySetter), new UIPropertyMetadata("0"));




        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(PropertySetter), new UIPropertyMetadata("def"));




        public string Adress
        {
            get { return (string)GetValue(AdressProperty); }
            set { SetValue(AdressProperty, value); }
        }

        public static readonly DependencyProperty AdressProperty =
            DependencyProperty.Register("Adress", typeof(string), typeof(PropertySetter), new UIPropertyMetadata(""));



        public PropertySetter():base()
        {
        }
    }

И вуаля, все это правильно связывается, и теперь я сделал слой между загруженным XAML во время выполнения и логикой приложения.

0 голосов
/ 15 августа 2011

Здесь вам нужно реализовать INotifyPropertyChanged в вашем классе PropertySetter и запустить событие PropertyChanged в установщиках каждого из ваших свойств.Это механизм, с помощью которого привязка знает, как обновить пользовательский интерфейс при изменениях в источнике.

class PropertySetter :UserControl,INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string address;
    private string text;
    private string value;

    public string Value
    {
        get { return value; }
        set
        {
            if (value == value)
                return;
            value = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Value"));
        }
    }

    public string Text
    {
        get { return text; }
        set
        {
            if (text == value)
                return;
            text = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Text"));
        }
    }

    public string Address
    {
        get { return address; }
        set
        {
            if (address == value)
                return;
            address = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Address"));
        }
    }

    public PropertySetter()
    {

    }
}

PS: для привязки данных TwoWay, которая используется для указания привязки данныхчто при внесении изменений в target (в вашем случае, свойства CheckBox), они отражаются в source (в вашем случае, PropertySetter 'свойства).

Надеюсь, это поможет:)

...