Как определить UserControl с пользовательским контентом? - PullRequest
2 голосов
/ 23 июля 2011

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

Невозможно установить значение атрибута Name 'butt' для элемента 'Button'.Кнопка находится в области действия элемента UserControl1, имя которого уже зарегистрировано, когда оно было определено в другой области.

Я не понимаю, почему это происходит.Вот код:

<UserControl x:Class="WpfApplication5.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
             x:Name="control">
    <ContentPresenter Content="{Binding ElementName=control, Path=DataContext}" />
</UserControl>

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="350" Width="525">
    <local:UserControl1>
        <local:UserControl1.DataContext>
            <Button x:Name="butt" />
        </local:UserControl1.DataContext>
    </local:UserControl1>
</Window>

Как это сделать правильно?

Ответы [ 2 ]

0 голосов
/ 23 июля 2011

Вы не можете назвать элементы внутри UserControls, кто-то посчитал это ошибкой, но я не знаю, так ли это, в любом случае, это не будет работать. Вы можете объявить Button как ресурс вашего окна, а затем вставить его через StaticResource, тогда имя не будет зарегистрировано как поле в классе окна.

В любом случае, вам действительно нужно имя?

Редактировать: Также см. этот вопрос.

0 голосов
/ 23 июля 2011

Вместо этого используйте DataContext = "{Binding ElementName = butt}".Или, если точка-сеть 4, используйте x: Reference:

<local:UserControl1 DataContext="{Binding ElementName=butt}">

Или

<local:UserControl1 DataContext="{x:Reference butt}">

Затем вы можете определить свою кнопку в окне, чтобы выполнить привязки, которые вы, вероятно, пытаетесь сделать.

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