Привязка ListBox к свойствам интерфейса в Silverlight - PullRequest
3 голосов
/ 02 марта 2011

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

Мой код C #:

namespace MyNamespace
{
    interface IFoo
    {
        string Bar { get; }
    }

    class Fizz
    {
        private class Buzz : IFoo
        {
            public string Bar { get { return "something"; } }
        }

        public IEnumerable<IFoo> GetFoo()
        {
            List<Buzz> items = new List<Buzz>();
            // Populate items
            return items;
        }
    }
}

Когда я пытаюсь связать данные с выводом из Fizz::GetFoo()не работаетМой XAML выглядит так:

<ListBox Name="listBox1" ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                 <TextBlock Text="Bar:" />
                 <TextBlock Text="{Binding Bar}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Когда я запускаю его, я вижу текст для первого TextBlock, но не второй.Я вижу ошибки в окне вывода, подобные этому:

    System.Windows.Data Error: Cannot get 'Bar' value (type 'System.String') from 'Buzz' (type 'MyNamespace.Fizz+Buzz'). BindingExpression: Path='Bar' DataItem='Buzz' (HashCode=100433959); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String').. System.MethodAccessException: Attempt to access the method failed: MyNamespace.Fizz+Buzz.get_Bar()
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Reflection.RuntimePropertyInfo.InternalGetValue(PropertyInfo thisProperty, Object obj, Object[] index, StacA first chance exception of type 'System.MethodAccessException' occurred in mscorlib.dll

Я делаю что-то не так или то, что я пытаюсь сделать, просто невозможно?

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Похоже, что все в вашей цепочке должно быть общедоступным (и ваш List должен быть List<IFoo> вместо List<Bar>):

public interface IFoo
{
    string Bar { get; }
}

public class Fizz
{
    public class Buzz : IFoo
    {
        public string Bar { get { return "something"; } }
    }

    public IEnumerable<IFoo> GetFoo()
    {
        List<IFoo> items = new List<IFoo>();
        // Populate items
        return items;
    }
}

Проблема, с которой вы сталкиваетесь, связана с отражением в сборках. Код Silverlight отражается на вашем внутреннем классе и интерфейсе (классы и интерфейсы internal, если не указано иное). Даже Buzz должен быть публичным, потому что он все еще должен отражать тот класс, который является частным, поэтому он терпит неудачу.

Очевидно, что если вы не используете привязку данных здесь, код будет работать нормально. У вас будет доступ к IFoo, хотя Buzz является приватным. Но, как только вы привнесете отражение в микс, вы, к сожалению, должны начать обнародовать вещи.

1 голос
/ 02 марта 2011

Проблема в том, что ваш класс Buzz является частным, и поэтому механизм привязки не может получить доступ к членам этого класса для выполнения привязки.

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