usercontrol с привязкой содержимого кнопки - PullRequest
1 голос
/ 06 мая 2011

У меня есть пользовательский контроль, который я хочу использовать повторно, но я не могу найти способ изменить содержимое кнопки. Я уже попробовал все, что искал здесь. Если кто-то может сказать мне, чего не хватает, я был бы очень признателен, так как я пытался выяснить это весь день. вот мой код:

    <UserControl x:Class="SamplePopupWPF.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
    <StackPanel>
        <Button x:Uid="btnLeft" Name="btnBindCmd" Height="23" Click="AddCommand" Content="{Binding ContentText, Mode=TwoWay}", DataContext="UserControl1"/>

    </StackPanel>
</Grid>

Код для управления пользователем:

 public string ContentText
    {
        get { return (string) GetValue(ContentTextProperty);  }
        set { SetValue(ContentTextProperty, value); }
    }

  public static readonly DependencyProperty ContentTextProperty = DependencyProperty.Register("ContentText",     typeof (String),  typeof (UserControl1),new IPropertyMetadata(String.Empty,textChangedCallback));

    static void textChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

        UserControl1 c = (UserControl1) d;
        c.ContentText = e.NewValue as String;
   }

вот Somepage, использующий элемент управления: "

    <Grid >
            <user:UserControl1 x:Name="btnTEST" AddCommandClick="onBtnClick" ContentText="{Binding OtherCmd, ElementName=UserControl1}" />

    </Grid>

код для Somepage с помощью элемента управления:

public string OtherCmd
    {

        get { return _otherCmd; }
        set
        {
            _otherCmd = value;
            //if (this.PropertyChanged != null)
                NotifyProperty("OtherCmd");

        }
    }

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
            OtherCmd = "helloTest";
    }

 public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyProperty(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

В какой-то момент я не использовал все коды, которые я поместил выше, но все еще не работает. Пожалуйста помоги. спасибо.

Ответы [ 3 ]

1 голос
/ 06 мая 2011

В вашем UserControl1.xaml.cs напишите this.DataContext = this; под InitializeComponent(); в конструкторе.

Это потому, что вы не можете назначить текстовый текст данных, как вы делаете это в UserControl1.xaml.Кент показывает правильный путь.

1 голос
/ 02 июля 2013

Вы просто должны наследовать свою страницу с INOTIFYPROPERTYCHANGED, как это

public class Subject :INotifyPropertyChanged
{

}
1 голос
/ 06 мая 2011

Кнопка привязана к ContentText, но не имеет DataContext, поэтому она наследует его от своего родителя.Возможно, вы захотите сделать это:

<UserControl
        x:Name="root"
        x:Class="SamplePopupWPF.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300"
        Width="300">
    <Grid DataContext="{Binding ElementName=root}">
        <StackPanel>
            <Button x:Uid="btnLeft" Name="btnBindCmd" Height="23" Click="AddCommand" Content="{Binding ContentText, Mode=TwoWay}", DataContext="UserControl1"/>
        </StackPanel>
    </Grid>
</UserControl>

Обратите внимание, что корню Grid присвоено значение DataContext, равное UserControl.Таким образом, Binding в Button будет пытаться разрешить свойство ContentText в экземпляре UserControl.

...